Compare commits

...

20 Commits
6.14 ... 6.15

Author SHA1 Message Date
2dust
69050bfe41 up 6.15 2023-03-04 08:52:03 +08:00
2dust
eebc16bcdd Minimize windows when auto-hide is enabled 2023-03-04 08:51:29 +08:00
2dust
d4921535f2 Add lock for db 2023-03-04 08:43:44 +08:00
2dust
b1eeb648a7 Adjust style for icon 2023-03-04 08:36:57 +08:00
2dust
285f91e9e8 bug fixes 2023-03-03 10:45:09 +08:00
2dust
947a7aa7df Modify blacklist rules 2023-03-03 10:15:39 +08:00
2dust
0b37e36036 Merge pull request #3382 from hvvvvvvv/master
解决全局热键不能录制Alt组合键的问题
2023-03-01 09:18:04 +08:00
2dust
92320f5086 Merge pull request #3380 from qiopgh/master
为tun做dns分流
2023-03-01 09:17:52 +08:00
chao wan
ae17e0c264 解决全局热键不能录制Alt组合键的问题 2023-02-28 23:32:58 +08:00
qiopgh
ec756ee943 Update tun_singbox_dns
为tun做dns分流
2023-02-28 22:08:15 +08:00
2dust
b0ff814753 Adjust Running Server ToolTipText 2023-02-28 20:37:45 +08:00
2dust
1f7eb2d48a Optimizing reload core 2023-02-28 20:23:15 +08:00
2dust
eeab8e4a90 Setting tab 2023-02-27 13:26:08 +08:00
2dust
77fbddf488 Improve subscription update without proxy 2023-02-27 13:25:45 +08:00
2dust
bf396f8802 Merge pull request #3370 from hxdhttk/hxdhttk/trayToolTip
Add tray tool tip for the current running server.
2023-02-27 13:04:05 +08:00
Minghao Hu
13cb8b84bf Add tray tool tip for running server. 2023-02-27 11:30:54 +08:00
2dust
3ab992f5fb Merge pull request #3340 from ShiinaRinne/patch-2
Update OptionSettingWindow.xaml
2023-02-24 21:06:27 +08:00
2dust
a386ecfc9c Merge pull request #3336 from ShiinaRinne/patch-1
Update MainWindow.xaml
2023-02-24 21:05:42 +08:00
ShiinaRinne
a71399c42c Update OptionSettingWindow.xaml
调整option页宽度,设置说明自动换行
2023-02-24 15:00:19 +08:00
ShiinaRinne
5a5d7e0981 Update MainWindow.xaml
确保popupbox在点击功能后不会自动关闭,方便测试或多次调整看效果
2023-02-24 12:32:32 +08:00
20 changed files with 221 additions and 132 deletions

View File

@@ -9,8 +9,9 @@ namespace v2rayN.Base
private static readonly Lazy<SqliteHelper> _instance = new(() => new());
public static SqliteHelper Instance => _instance.Value;
private string _connstr;
public SQLiteConnection _db;
public SQLiteAsyncConnection _dbAsync;
private SQLiteConnection _db;
private SQLiteAsyncConnection _dbAsync;
private static readonly object objLock = new();
public SqliteHelper()
{
@@ -34,7 +35,10 @@ namespace v2rayN.Base
}
public int Replace(object model)
{
return _db.InsertOrReplace(model);
lock (objLock)
{
return _db.InsertOrReplace(model);
}
}
public async Task<int> Replacesync(object model)
{
@@ -43,7 +47,10 @@ namespace v2rayN.Base
public int Update(object model)
{
return _db.Update(model);
lock (objLock)
{
return _db.Update(model);
}
}
public async Task<int> UpdateAsync(object model)
{
@@ -51,12 +58,18 @@ namespace v2rayN.Base
}
public int UpdateAll(IEnumerable models)
{
return _db.UpdateAll(models);
lock (objLock)
{
return _db.UpdateAll(models);
}
}
public int Delete(object model)
{
return _db.Delete(model);
lock (objLock)
{
return _db.Delete(model);
}
}
public async Task<int> DeleteAsync(object model)
{

View File

@@ -124,7 +124,6 @@
#region global variable
public static bool reloadCore { get; set; }
public static int statePort { get; set; }
public static Job processJob { get; set; }
public static bool ShowInTaskbar { get; set; }

View File

@@ -195,16 +195,6 @@ namespace v2rayN.Handler
config.guiItem.statisticsFreshRate = 1;
}
if (config == null)
{
Global.reloadCore = false;
}
else
{
Global.reloadCore = true;
}
LazyConfig.Instance.SetConfig(config);
return 0;
}
@@ -215,7 +205,6 @@ namespace v2rayN.Handler
/// <returns></returns>
public static int SaveConfig(ref Config config, bool reload = true)
{
Global.reloadCore = reload;
ToJsonFile(config);
@@ -446,7 +435,6 @@ namespace v2rayN.Handler
}
config.indexId = indexId;
Global.reloadCore = true;
ToJsonFile(config);
@@ -856,7 +844,6 @@ namespace v2rayN.Handler
}
else if (profileItem.indexId == config.indexId)
{
Global.reloadCore = true;
}
if (SqliteHelper.Instance.Replace(profileItem) > 0)
@@ -972,7 +959,7 @@ namespace v2rayN.Handler
var existItem = lstOriSub?.FirstOrDefault(t => CompareProfileItem(t, profileItem, true));
if (existItem != null)
{
profileItem = existItem;
profileItem.indexId = existItem.indexId;
}
//filter
if (!Utils.IsNullOrEmpty(subFilter))
@@ -1461,8 +1448,6 @@ namespace v2rayN.Handler
config.routingBasicItem.routingIndexId = routingItem.id;
}
Global.reloadCore = true;
ToJsonFile(config);
return 0;

View File

@@ -27,46 +27,43 @@ namespace v2rayN.Handler
public void LoadCore(Config config)
{
if (Global.reloadCore)
var node = ConfigHandler.GetDefaultServer(ref config);
if (node == null)
{
var node = ConfigHandler.GetDefaultServer(ref config);
if (node == null)
{
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
if (SetCore(config, node) != 0)
{
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
string fileName = Utils.GetConfigPath(_coreCConfigRes);
if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0)
{
ShowMsg(false, msg);
}
else
{
ShowMsg(false, msg);
ShowMsg(true, $"{node.GetSummary()}");
CoreStop();
CoreStart(node);
}
if (SetCore(config, node) != 0)
{
ShowMsg(false, ResUI.CheckServerSettings);
return;
}
string fileName = Utils.GetConfigPath(_coreCConfigRes);
if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0)
{
ShowMsg(false, msg);
}
else
{
ShowMsg(false, msg);
ShowMsg(true, $"{node.GetSummary()}");
CoreStop();
CoreStart(node);
}
//start a socks service
if (_process != null && !_process.HasExited && node.configType == EConfigType.Custom && node.preSocksPort > 0)
//start a socks service
if (_process != null && !_process.HasExited && node.configType == EConfigType.Custom && node.preSocksPort > 0)
{
var itemSocks = new ProfileItem()
{
var itemSocks = new ProfileItem()
{
configType = EConfigType.Socks,
address = Global.Loopback,
port = node.preSocksPort
};
if (CoreConfigHandler.GenerateClientConfig(itemSocks, null, out string msg2, out string configStr) == 0)
{
_processId = CoreStartViaString(configStr);
}
configType = EConfigType.Socks,
address = Global.Loopback,
port = node.preSocksPort
};
if (CoreConfigHandler.GenerateClientConfig(itemSocks, null, out string msg2, out string configStr) == 0)
{
_processId = CoreStartViaString(configStr);
}
}
}

View File

@@ -188,9 +188,11 @@ namespace v2rayN.Handler
try
{
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13);
var webProxy = GetWebProxy(blProxy);
var client = new HttpClient(new SocketsHttpHandler()
{
Proxy = GetWebProxy(blProxy)
Proxy = webProxy,
UseProxy = webProxy != null
});
if (Utils.IsNullOrEmpty(userAgent))

View File

@@ -24,7 +24,7 @@ namespace v2rayN.Handler
_lstProfileEx = new(SqliteHelper.Instance.Table<ProfileExItem>());
Task.Run(async () =>
Task.Run(() =>
{
while (true)
{
@@ -35,7 +35,7 @@ namespace v2rayN.Handler
var item = _lstProfileEx.FirstOrDefault(t => t.indexId == id);
if (item is not null)
{
await SqliteHelper.Instance.Replacesync(item);
SqliteHelper.Instance.Replace(item);
}
}
Thread.Sleep(1000 * 60);

View File

@@ -162,7 +162,7 @@ namespace v2rayN.Handler
todayDown = 0,
dateNow = ticks
};
_ = SqliteHelper.Instance.Replacesync(_serverStatItem);
SqliteHelper.Instance.Replace(_serverStatItem);
_lstServerStat.Add(_serverStatItem);
}
}

View File

@@ -164,14 +164,14 @@ namespace v2rayN.Handler
Task.Run(async () =>
{
//Turn off system proxy
bool bSysProxyType = false;
if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange)
{
bSysProxyType = true;
config.sysProxyType = ESysProxyType.ForcedClear;
SysProxyHandle.UpdateSysProxy(config, false);
Thread.Sleep(3000);
}
//bool bSysProxyType = false;
//if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange)
//{
// bSysProxyType = true;
// config.sysProxyType = ESysProxyType.ForcedClear;
// SysProxyHandle.UpdateSysProxy(config, false);
// Thread.Sleep(3000);
//}
foreach (var item in subItem)
{
@@ -235,12 +235,12 @@ namespace v2rayN.Handler
}
_updateFunc(false, "-------------------------------------------------------");
}
//restore system proxy
if (bSysProxyType)
{
config.sysProxyType = ESysProxyType.ForcedChange;
SysProxyHandle.UpdateSysProxy(config, false);
}
////restore system proxy
//if (bSysProxyType)
//{
// config.sysProxyType = ESysProxyType.ForcedChange;
// SysProxyHandle.UpdateSysProxy(config, false);
//}
_updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}");
});

View File

@@ -14,7 +14,14 @@
{
"outboundTag": "proxy",
"ip": [
"geoip:telegram"
"geoip:cloudflare",
"geoip:cloudfront",
"geoip:facebook",
"geoip:fastly",
"geoip:google",
"geoip:netflix",
"geoip:telegram",
"geoip:twitter"
],
"domain": [
"geosite:gfw",

View File

@@ -1,5 +1,10 @@
{
"servers": [
{
"tag": "out_dns",
"address": "8.8.8.8",
"detour": "proxy"
},
{
"tag": "local",
"address": "223.5.5.5",
@@ -11,6 +16,11 @@
}
],
"rules": [
{
"geosite": "cn",
"server": "local",
"disable_cache": true
},
{
"geosite": "category-ads-all",
"server": "block",
@@ -18,4 +28,4 @@
}
],
"strategy": "ipv4_only"
}
}

View File

@@ -175,6 +175,8 @@ namespace v2rayN.ViewModels
[Reactive]
public string RunningServerDisplay { get; set; }
[Reactive]
public string RunningServerToolTipText { get; set; }
[Reactive]
public string RunningInfoDisplay { get; set; }
[Reactive]
public string SpeedProxyDisplay { get; set; }
@@ -538,8 +540,12 @@ namespace v2rayN.ViewModels
_noticeHandler?.SendMessage(msg);
if (success)
{
var indexIdOld = _config.indexId;
RefreshServers();
Reload();
if (indexIdOld != _config.indexId)
{
Reload();
}
if (_config.uiItem.enableAutoAdjustMainLvColWidth)
{
_updateView("AdjustMainLvColWidth");
@@ -738,6 +744,7 @@ namespace v2rayN.ViewModels
subRemarks = t.subRemarks,
isActive = t.indexId == _config.indexId,
sort = t33 == null ? 0 : t33.sort,
delay = t33 == null ? 0 : t33.delay,
delayVal = t33?.delay != 0 ? $"{t33?.delay} {Global.DelayUnit}" : string.Empty,
speedVal = t33?.speed != 0 ? $"{t33?.speed} {Global.SpeedUnit}" : string.Empty,
todayDown = t22 == null ? "" : Utils.HumanFy(t22.todayDown),
@@ -770,7 +777,9 @@ namespace v2rayN.ViewModels
var running = ConfigHandler.GetDefaultServer(ref _config);
if (running != null)
{
RunningServerDisplay = string.Format("{0}:{1}", ResUI.menuServers, running.GetSummary());
var runningSummary = running.GetSummary();
RunningServerDisplay = $"{ResUI.menuServers}:{runningSummary}";
RunningServerToolTipText = runningSummary;
}
}));
}
@@ -1362,7 +1371,6 @@ namespace v2rayN.ViewModels
public void Reload()
{
Global.reloadCore = true;
_ = LoadV2ray();
}
@@ -1382,7 +1390,6 @@ namespace v2rayN.ViewModels
{
_coreHandler.LoadCore(_config);
Global.reloadCore = false;
//ConfigHandler.SaveConfig(ref _config, false);
ChangeSystemProxyStatus(_config.sysProxyType, false);

View File

@@ -299,7 +299,7 @@ namespace v2rayN.ViewModels
UI.Show(ResUI.OperationSuccess);
}
}
private void ImportRulesFromUrl()
private async Task ImportRulesFromUrl()
{
var url = SelectedRouting.url;
if (Utils.IsNullOrEmpty(url))
@@ -308,19 +308,16 @@ namespace v2rayN.ViewModels
return;
}
Task.Run(async () =>
DownloadHandle downloadHandle = new DownloadHandle();
string result = await downloadHandle.TryDownloadString(url, true, "");
if (AddBatchRoutingRules(SelectedRouting, result) == 0)
{
DownloadHandle downloadHandle = new DownloadHandle();
string result = await downloadHandle.DownloadStringAsync(url, false, "");
if (AddBatchRoutingRules(SelectedRouting, result) == 0)
Application.Current.Dispatcher.Invoke((Action)(() =>
{
Application.Current.Dispatcher.Invoke((Action)(() =>
{
RefreshRulesItems();
}));
UI.Show(ResUI.OperationSuccess);
}
});
RefreshRulesItems();
}));
UI.Show(ResUI.OperationSuccess);
}
}
private int AddBatchRoutingRules(RoutingItem routingItem, string clipboardData)
{

View File

@@ -57,19 +57,21 @@ namespace v2rayN.Views
private void TxtGlobalHotkey_KeyDown(object sender, KeyEventArgs e)
{
var txt = ((TextBox)sender);
var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1));
e.Handled = true;
var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift, Key.LeftAlt, Key.RightAlt };
if (!_ModifierKeys.Contains(e.Key) && !_ModifierKeys.Contains(e.SystemKey))
{
var txt = ((TextBox)sender);
var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1));
var formsKey = (Forms.Keys)KeyInterop.VirtualKeyFromKey(e.Key == Key.System ? e.SystemKey : e.Key);
if (e.Key == Key.System)
return;
var formsKey = (Forms.Keys)KeyInterop.VirtualKeyFromKey(e.Key);
lstKey[index].KeyCode = formsKey;
lstKey[index].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt;
lstKey[index].Control = (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control;
lstKey[index].Shift = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift;
lstKey[index].KeyCode = formsKey;
lstKey[index].Alt = Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt);
lstKey[index].Control = Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl);
lstKey[index].Shift = Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift);
BindingData(index);
BindingData(index);
}
}
private void BindingData(int index)

View File

@@ -53,7 +53,10 @@
<MenuItem Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Server" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Server" />
<TextBlock Text="{x:Static resx:ResUI.menuServers}" />
</StackPanel>
</MenuItem.Header>
@@ -99,7 +102,10 @@
<MenuItem Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="BookClockOutline" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="BookClockOutline" />
<TextBlock Text="{x:Static resx:ResUI.menuSubscription}" />
</StackPanel>
</MenuItem.Header>
@@ -131,7 +137,10 @@
<MenuItem Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="SettingsOutline" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="SettingsOutline" />
<TextBlock Text="{x:Static resx:ResUI.menuSetting}" />
</StackPanel>
</MenuItem.Header>
@@ -169,7 +178,10 @@
<MenuItem x:Name="menuReload" Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Reload" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Reload" />
<TextBlock Text="{x:Static resx:ResUI.menuReload}" />
</StackPanel>
</MenuItem.Header>
@@ -180,7 +192,10 @@
<MenuItem Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Update" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Update" />
<TextBlock Text="{x:Static resx:ResUI.menuCheckUpdate}" />
</StackPanel>
</MenuItem.Header>
@@ -221,7 +236,10 @@
<MenuItem x:Name="menuHelp" Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="HelpCircleOutline" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="HelpCircleOutline" />
<TextBlock Text="{x:Static resx:ResUI.menuHelp}" />
</StackPanel>
</MenuItem.Header>
@@ -235,7 +253,10 @@
Click="menuPromotion_Click">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="VolumeHigh" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="VolumeHigh" />
<TextBlock Text="{x:Static resx:ResUI.menuPromotion}" />
</StackPanel>
</MenuItem.Header>
@@ -249,7 +270,10 @@
Click="menuClose_Click">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Minimize" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Minimize" />
<TextBlock Text="{x:Static resx:ResUI.menuClose}" />
</StackPanel>
</MenuItem.Header>
@@ -259,6 +283,7 @@
<materialDesign:PopupBox
Padding="8,0"
HorizontalAlignment="Right"
StaysOpen="True"
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
<StackPanel Margin="8">
<Grid>
@@ -351,7 +376,7 @@
Height="30"
Margin="4,0"
Style="{StaticResource MaterialDesignFloatingActionMiniLightButton}">
<materialDesign:PackIcon Kind="Plus" />
<materialDesign:PackIcon VerticalAlignment="Center" Kind="Plus" />
</Button>
<TextBox
x:Name="txtServerFilter"
@@ -712,6 +737,7 @@
<materialDesign:PackIcon
x:Name="menuSystemProxyClear2"
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Check" />
<TextBlock Text="{x:Static resx:ResUI.menuSystemProxyClear}" />
</StackPanel>
@@ -723,6 +749,7 @@
<materialDesign:PackIcon
x:Name="menuSystemProxySet2"
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Check" />
<TextBlock Text="{x:Static resx:ResUI.menuSystemProxySet}" />
</StackPanel>
@@ -734,6 +761,7 @@
<materialDesign:PackIcon
x:Name="menuSystemProxyNothing2"
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Check" />
<TextBlock Text="{x:Static resx:ResUI.menuSystemProxyNothing}" />
</StackPanel>
@@ -745,6 +773,7 @@
<materialDesign:PackIcon
x:Name="menuSystemProxyPac2"
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Check" />
<TextBlock Text="{x:Static resx:ResUI.menuSystemProxyPac}" />
</StackPanel>

View File

@@ -158,6 +158,7 @@ namespace v2rayN.Views
this.BindCommand(ViewModel, vm => vm.SubUpdateViaProxyCmd, v => v.menuSubUpdateViaProxy2).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.NotifyIcon, v => v.tbNotify.Icon).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.RunningServerToolTipText, v => v.tbNotify.ToolTipText).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.NotifyLeftClickCmd, v => v.tbNotify.LeftClickCommand).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.AppIcon, v => v.Icon).DisposeWith(disposables);
@@ -190,6 +191,11 @@ namespace v2rayN.Views
this.Title = $"{Utils.GetVersion()} - {(IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
spEnableTun.Visibility = IsAdministrator ? Visibility.Visible : Visibility.Collapsed;
if (_config.uiItem.autoHideStartup)
{
WindowState = WindowState.Minimized;
}
}
#region Event

View File

@@ -10,7 +10,7 @@
xmlns:resx="clr-namespace:v2rayN.Resx"
xmlns:vms="clr-namespace:v2rayN.ViewModels"
Title="{x:Static resx:ResUI.menuSetting}"
Width="900"
Width="1000"
Height="700"
x:TypeArguments="vms:OptionSettingViewModel"
Background="{DynamicResource MaterialDesignPaper}"
@@ -47,7 +47,7 @@
Style="{StaticResource DefButton}" />
</Grid>
<TabControl>
<TabControl HorizontalContentAlignment="Left">
<TabItem Header="{x:Static resx:ResUI.TbSettingsCore}">
<ScrollViewer VerticalScrollBarVisibility="Visible">
<Grid Margin="{StaticResource SettingItemMargin}">
@@ -485,7 +485,7 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
@@ -507,7 +507,8 @@
Margin="{StaticResource ServerItemMargin}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsStartBootTip}" />
Text="{x:Static resx:ResUI.TbSettingsStartBootTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="2"
@@ -719,7 +720,8 @@
Margin="{StaticResource ServerItemMargin}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamilyTip}" />
Text="{x:Static resx:ResUI.TbSettingsCurrentFontFamilyTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="16"

View File

@@ -32,28 +32,40 @@
Style="{StaticResource MaterialDesignToolBar}">
<Button x:Name="menuRuleAdd">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Plus" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Plus" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuRuleAdd}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuImportRulesFromFile">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Import" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Import" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuImportRulesFromFile}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuImportRulesFromClipboard">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Import" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Import" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuImportRulesFromClipboard}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuImportRulesFromUrl">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Import" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Import" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuImportRulesFromUrl}" />
</StackPanel>
</Button>

View File

@@ -39,7 +39,10 @@
<MenuItem x:Name="menuRoutingBasic" Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Server" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Server" />
<TextBlock Text="{x:Static resx:ResUI.menuRoutingBasic}" />
</StackPanel>
</MenuItem.Header>
@@ -54,7 +57,10 @@
<MenuItem x:Name="menuRoutingAdvanced" Padding="8,0">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Routes" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Routes" />
<TextBlock Text="{x:Static resx:ResUI.menuRoutingAdvanced}" />
</StackPanel>
</MenuItem.Header>

View File

@@ -33,28 +33,40 @@
Style="{StaticResource MaterialDesignToolBar}">
<Button x:Name="menuSubAdd">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Plus" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Plus" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuSubAdd}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuSubDelete">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Delete" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Delete" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuSubDelete}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuSubEdit">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Edit" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Edit" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuSubEdit}" />
</StackPanel>
</Button>
<Separator />
<Button x:Name="menuSubShare">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="QrcodePlus" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="QrcodePlus" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuSubShare}" />
</StackPanel>
</Button>
@@ -63,7 +75,10 @@
Click="menuClose_Click"
IsCancel="True">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0,0,8,0" Kind="Close" />
<materialDesign:PackIcon
Margin="0,0,8,0"
VerticalAlignment="Center"
Kind="Close" />
<TextBlock Style="{StaticResource ToolbarTextBlock}" Text="{x:Static resx:ResUI.menuClose}" />
</StackPanel>
</Button>

View File

@@ -10,7 +10,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
<FileVersion>6.14</FileVersion>
<FileVersion>6.15</FileVersion>
</PropertyGroup>
<ItemGroup>