Compare commits

..

22 Commits

Author SHA1 Message Date
2dust
4875b37f70 up 7.12.5 2025-05-25 19:12:06 +08:00
2dust
2f3fba73de Bug fix
https://github.com/2dust/v2rayN/issues/7333
2025-05-25 19:11:42 +08:00
2dust
2ab1b9068f up 7.12.4 2025-05-21 20:00:41 +08:00
DHR60
b9613875ce Determine .exe suffix based on OS in GenRoutingDirectExe (#7322)
* Determine .exe suffix based on OS in GenRoutingDirectExe

* Uses Utils.GetExeName
2025-05-21 19:57:23 +08:00
2dust
5d2aea6b4f Change the inbound of the xray configuration file from socks to mixed 2025-05-17 14:51:18 +08:00
Pk-web6936
5824e18ed6 Update Persian translate (#7273) 2025-05-15 19:21:53 +08:00
2dust
4f8648cbc9 Fix
https://github.com/2dust/v2rayN/issues/7270
2025-05-12 20:29:34 +08:00
2dust
01b021b2c3 Bug fix
https://github.com/2dust/v2rayN/issues/7279
2025-05-12 20:28:28 +08:00
2dust
331e8ce960 up 7.12.3 2025-05-11 19:19:26 +08:00
2dust
a2cfe6fa51 Added the current connection information test url option
https://github.com/2dust/v2rayN/discussions/7268
2025-05-11 16:59:00 +08:00
2dust
8381fefb78 up 7.12.2 2025-05-11 10:39:02 +08:00
2dust
d3b95d781a Removed the function of displaying the current connection IP
https://github.com/2dust/v2rayN/discussions/7268
2025-05-11 10:38:48 +08:00
2dust
3a4a96f87a Fix
https://github.com/2dust/v2rayN/issues/7258
2025-05-09 14:33:41 +08:00
2dust
3d462c4be3 Fix
https://github.com/2dust/v2rayN/issues/7247
2025-05-08 15:56:52 +08:00
2dust
82b366cd9b Fix
https://github.com/2dust/v2rayN/issues/7244
2025-05-07 14:28:55 +08:00
DHR60
897a4e5635 Move exe direct rule before clash_mode (#7236) 2025-05-05 13:59:14 +08:00
2dust
8ea76fd318 up 7.12.1 2025-05-04 17:44:36 +08:00
2dust
693a96fff2 Update Directory.Packages.props 2025-05-04 17:44:04 +08:00
DHR60
8b4e2f8f23 Fix DNS (#7233)
* Fix DNS

* Removes expectIPs from remote DNS
2025-05-04 17:28:57 +08:00
2dust
13b164acac Enhanced sorting function, can sort by statistics 2025-05-03 11:29:36 +08:00
2dust
e590547b30 Revert "Bug fix"
This reverts commit 5a0fdd971a.
2025-05-02 10:44:20 +08:00
2dust
5a0fdd971a Bug fix
https://github.com/2dust/v2rayN/issues/7211
2025-04-30 14:12:02 +08:00
37 changed files with 262 additions and 123 deletions

View File

@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<Version>7.12.0</Version>
<Version>7.12.5</Version>
</PropertyGroup>
<PropertyGroup>

View File

@@ -5,10 +5,10 @@
<CentralPackageVersionOverrideEnabled>false</CentralPackageVersionOverrideEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.2.8" />
<PackageVersion Include="Avalonia.Desktop" Version="11.2.8" />
<PackageVersion Include="Avalonia.Diagnostics" Version="11.2.8" />
<PackageVersion Include="Avalonia.ReactiveUI" Version="11.2.8" />
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.0" />
<PackageVersion Include="Avalonia.Desktop" Version="11.3.0" />
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.0" />
<PackageVersion Include="Avalonia.ReactiveUI" Version="11.3.0" />
<PackageVersion Include="CliWrap" Version="3.8.2" />
<PackageVersion Include="Downloader" Version="3.3.4" />
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.3.0" />

View File

@@ -8,9 +8,7 @@ public class Global
public const string GithubUrl = "https://github.com";
public const string GithubApiUrl = "https://api.github.com/repos";
public const string GeoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
public const string SingboxRulesetUrl = @"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-{0}/{1}.srs";
public const string IPAPIUrl = "https://api.ip.sb/geoip";
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
public const string ConfigFileName = "guiNConfig.json";
@@ -519,5 +517,15 @@ public class Global
@"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb"
];
public static readonly List<string> IPAPIUrls =
[
@"https://speed.cloudflare.com/meta",
@"https://api.ip.sb/geoip",
@"https://api-ipv4.ip.sb/geoip",
@"https://api-ipv6.ip.sb/geoip",
@"https://api.ipapi.is",
@""
];
#endregion const
}

View File

@@ -122,7 +122,7 @@ public class ConfigHandler
}
if (config.SpeedTestItem.SpeedPingTestUrl.IsNullOrEmpty())
{
config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrl;
config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrls.First();
}
if (config.SpeedTestItem.MixedConcurrencyCount < 1)
{
@@ -799,8 +799,11 @@ public class ConfigHandler
{
return -1;
}
var lstServerStat = (config.GuiItem.EnableStatistics ? StatisticsHandler.Instance.ServerStat : null) ?? [];
var lstProfileExs = await ProfileExHandler.Instance.GetProfileExs();
var lstProfile = (from t in lstModel
join t2 in lstServerStat on t.IndexId equals t2.IndexId into t2b
from t22 in t2b.DefaultIfEmpty()
join t3 in lstProfileExs on t.IndexId equals t3.IndexId into t3b
from t33 in t3b.DefaultIfEmpty()
select new ProfileItemModel
@@ -815,7 +818,11 @@ public class ConfigHandler
StreamSecurity = t.StreamSecurity,
Delay = t33?.Delay ?? 0,
Speed = t33?.Speed ?? 0,
Sort = t33?.Sort ?? 0
Sort = t33?.Sort ?? 0,
TodayDown = (t22?.TodayDown ?? 0).ToString("D16"),
TodayUp = (t22?.TodayUp ?? 0).ToString("D16"),
TotalDown = (t22?.TotalDown ?? 0).ToString("D16"),
TotalUp = (t22?.TotalUp ?? 0).ToString("D16"),
}).ToList();
Enum.TryParse(colName, true, out EServerColName name);
@@ -833,6 +840,10 @@ public class ConfigHandler
EServerColName.DelayVal => lstProfile.OrderBy(t => t.Delay).ToList(),
EServerColName.SpeedVal => lstProfile.OrderBy(t => t.Speed).ToList(),
EServerColName.SubRemarks => lstProfile.OrderBy(t => t.Subid).ToList(),
EServerColName.TodayDown => lstProfile.OrderBy(t => t.TodayDown).ToList(),
EServerColName.TodayUp => lstProfile.OrderBy(t => t.TodayUp).ToList(),
EServerColName.TotalDown => lstProfile.OrderBy(t => t.TotalDown).ToList(),
EServerColName.TotalUp => lstProfile.OrderBy(t => t.TotalUp).ToList(),
_ => lstProfile
};
}
@@ -849,6 +860,10 @@ public class ConfigHandler
EServerColName.DelayVal => lstProfile.OrderByDescending(t => t.Delay).ToList(),
EServerColName.SpeedVal => lstProfile.OrderByDescending(t => t.Speed).ToList(),
EServerColName.SubRemarks => lstProfile.OrderByDescending(t => t.Subid).ToList(),
EServerColName.TodayDown => lstProfile.OrderByDescending(t => t.TodayDown).ToList(),
EServerColName.TodayUp => lstProfile.OrderByDescending(t => t.TodayUp).ToList(),
EServerColName.TotalDown => lstProfile.OrderByDescending(t => t.TotalDown).ToList(),
EServerColName.TotalUp => lstProfile.OrderByDescending(t => t.TotalUp).ToList(),
_ => lstProfile
};
}

View File

@@ -0,0 +1,42 @@
namespace ServiceLib.Handler;
public class ConnectionHandler
{
private static readonly Lazy<ConnectionHandler> _instance = new(() => new());
public static ConnectionHandler Instance => _instance.Value;
public async Task<string> RunAvailabilityCheck()
{
var downloadHandle = new DownloadService();
var time = await downloadHandle.RunAvailabilityCheck(null);
var ip = time > 0 ? await GetIPInfo(downloadHandle) ?? Global.None : Global.None;
return string.Format(ResUI.TestMeOutput, time, ip);
}
private async Task<string?> GetIPInfo(DownloadService downloadHandle)
{
var url = AppHandler.Instance.Config.SpeedTestItem.IPAPIUrl;
if (url.IsNullOrEmpty())
{
return null;
}
var result = await downloadHandle.TryDownloadString(url, true, "");
if (result == null)
{
return null;
}
var ipInfo = JsonUtils.Deserialize<IPAPIInfo>(result);
if (ipInfo == null)
{
return null;
}
var ip = ipInfo.ip ?? ipInfo.clientIp ?? ipInfo.ip_addr ?? ipInfo.query;
var country = ipInfo.country_code ?? ipInfo.country ?? ipInfo.countryCode ?? ipInfo.location?.country_code;
return $"({country ?? "unknown"}) {ip}";
}
}

View File

@@ -6,9 +6,9 @@ public class VmessFmt : BaseFmt
{
msg = ResUI.ConfigurationFormatIncorrect;
ProfileItem? item;
if (str.IndexOf('?') > 0 && str.IndexOf('&') > 0)
if (str.IndexOf('@') > 0)
{
item = ResolveStdVmess(str);
item = ResolveStdVmess(str) ?? ResolveVmess(str, out msg);
}
else
{

View File

@@ -156,6 +156,7 @@ public class SpeedTestItem
public string SpeedTestUrl { get; set; }
public string SpeedPingTestUrl { get; set; }
public int MixedConcurrencyCount { get; set; }
public string IPAPIUrl { get; set; }
}
[Serializable]

View File

@@ -3,10 +3,17 @@ namespace ServiceLib.Models;
internal class IPAPIInfo
{
public string? ip { get; set; }
public string? city { get; set; }
public string? region { get; set; }
public string? region_code { get; set; }
public string? clientIp { get; set; }
public string? ip_addr { get; set; }
public string? query { get; set; }
public string? country { get; set; }
public string? country_name { get; set; }
public string? country_code { get; set; }
public string? countryCode { get; set; }
public LocationInfo? location { get; set; }
}
public class LocationInfo
{
public string? country_code { get; set; }
}

View File

@@ -3201,6 +3201,15 @@ namespace ServiceLib.Resx {
}
}
/// <summary>
/// 查找类似 Current connection info test URL 的本地化字符串。
/// </summary>
public static string TbSettingsIPAPIUrl {
get {
return ResourceManager.GetString("TbSettingsIPAPIUrl", resourceCulture);
}
}
/// <summary>
/// 查找类似 Keep older entries when de-duplicating 的本地化字符串。
/// </summary>

View File

@@ -1416,4 +1416,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>صادر کردن سرور</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>URL آزمایش اطلاعات اتصال فعلی</value>
</data>
</root>

View File

@@ -1416,4 +1416,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>Export server</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>Current connection info test URL</value>
</data>
</root>

View File

@@ -1416,4 +1416,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>Export Configuration</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>Current connection info test URL</value>
</data>
</root>

View File

@@ -1416,4 +1416,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>Export server</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>Current connection info test URL</value>
</data>
</root>

View File

@@ -1413,4 +1413,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>导出配置文件</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>当前连接信息测试地址</value>
</data>
</root>

View File

@@ -1413,4 +1413,7 @@
<data name="menuExportConfig" xml:space="preserve">
<value>匯出設定檔</value>
</data>
<data name="TbSettingsIPAPIUrl" xml:space="preserve">
<value>目前連接資訊測試地址</value>
</data>
</root>

View File

@@ -6,11 +6,10 @@
"servers": [
{
"address": "1.1.1.1",
"skipFallback": true,
"domains": [
"geosite:geolocation-!cn"
],
"expectIPs": [
"geoip:!cn"
"domain:googleapis.cn",
"domain:gstatic.com"
]
},
{
@@ -23,6 +22,7 @@
"geoip:cn"
]
},
"1.1.1.1",
"8.8.8.8",
"https://dns.google/dns-query"
]

View File

@@ -979,26 +979,6 @@ public class CoreConfigSingboxService
try
{
var dnsOutbound = "dns_out";
if (!_config.Inbound.First().SniffingEnabled)
{
singboxConfig.route.rules.Add(new()
{
port = [53],
network = ["udp"],
outbound = dnsOutbound
});
}
singboxConfig.route.rules.Insert(0, new()
{
outbound = Global.DirectTag,
clash_mode = ERuleMode.Direct.ToString()
});
singboxConfig.route.rules.Insert(0, new()
{
outbound = Global.ProxyTag,
clash_mode = ERuleMode.Global.ToString()
});
if (_config.TunModeItem.EnableTun)
{
@@ -1025,6 +1005,27 @@ public class CoreConfigSingboxService
});
}
if (!_config.Inbound.First().SniffingEnabled)
{
singboxConfig.route.rules.Add(new()
{
port = [53],
network = ["udp"],
outbound = dnsOutbound
});
}
singboxConfig.route.rules.Add(new()
{
outbound = Global.DirectTag,
clash_mode = ERuleMode.Direct.ToString()
});
singboxConfig.route.rules.Add(new()
{
outbound = Global.ProxyTag,
clash_mode = ERuleMode.Global.ToString()
});
var routing = await ConfigHandler.GetDefaultRouting(_config);
if (routing != null)
{
@@ -1047,28 +1048,30 @@ public class CoreConfigSingboxService
private void GenRoutingDirectExe(out List<string> lstDnsExe, out List<string> lstDirectExe)
{
lstDnsExe = new();
lstDirectExe = new();
var coreInfo = CoreInfoHandler.Instance.GetCoreInfo();
foreach (var it in coreInfo)
var dnsExeSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var directExeSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var coreInfoResult = CoreInfoHandler.Instance.GetCoreInfo();
foreach (var coreConfig in coreInfoResult)
{
if (it.CoreType == ECoreType.v2rayN)
if (coreConfig.CoreType == ECoreType.v2rayN)
{
continue;
}
foreach (var it2 in it.CoreExes)
foreach (var baseExeName in coreConfig.CoreExes)
{
if (!lstDnsExe.Contains(it2) && it.CoreType != ECoreType.sing_box)
if (coreConfig.CoreType != ECoreType.sing_box)
{
lstDnsExe.Add($"{it2}.exe");
dnsExeSet.Add(Utils.GetExeName(baseExeName));
}
directExeSet.Add(Utils.GetExeName(baseExeName));
}
}
if (!lstDirectExe.Contains(it2))
{
lstDirectExe.Add($"{it2}.exe");
}
}
}
lstDnsExe = new List<string>(dnsExeSet);
lstDirectExe = new List<string>(directExeSet);
}
private async Task<int> GenRoutingUserRule(RulesItem item, List<Rule4Sbox> rules)
@@ -1087,14 +1090,11 @@ public class CoreConfigSingboxService
if (item.Port.IsNotEmpty())
{
if (item.Port.Contains("-"))
{
rule.port_range = new List<string> { item.Port.Replace("-", ":") };
}
else
{
rule.port = new List<int> { item.Port.ToInt() };
}
var portRanges = item.Port.Split(',').Where(it => it.Contains('-')).Select(it => it.Replace("-", ":")).ToList();
var ports = item.Port.Split(',').Where(it => !it.Contains('-')).Select(it => it.ToInt()).ToList();
rule.port_range = portRanges.Count > 0 ? portRanges : null;
rule.port = ports.Count > 0 ? ports : null;
}
if (item.Network.IsNotEmpty())
{

View File

@@ -328,7 +328,7 @@ public class CoreConfigV2rayService
{
listen = Global.Loopback,
port = port,
protocol = EInboundProtocol.socks.ToString(),
protocol = EInboundProtocol.mixed.ToString(),
};
inbound.tag = inbound.protocol + inbound.port.ToString();
v2rayConfig.inbounds.Add(inbound);
@@ -403,7 +403,7 @@ public class CoreConfigV2rayService
tag = $"{EInboundProtocol.socks}{port}",
listen = Global.Loopback,
port = port,
protocol = EInboundProtocol.socks.ToString(),
protocol = EInboundProtocol.mixed.ToString(),
});
ret.Msg = string.Format(ResUI.SuccessfulConfiguration, "");
@@ -507,7 +507,7 @@ public class CoreConfigV2rayService
}
inbound.tag = protocol.ToString();
inbound.port = inItem.LocalPort + (int)protocol;
inbound.protocol = EInboundProtocol.socks.ToString();
inbound.protocol = EInboundProtocol.mixed.ToString();
inbound.settings.udp = inItem.UdpEnabled;
inbound.sniffing.enabled = inItem.SniffingEnabled;
inbound.sniffing.destOverride = inItem.DestOverride;

View File

@@ -194,11 +194,11 @@ public class UpdateService
{
if (Utils.IsBase64String(result2))
{
result += Utils.Base64Decode(result2);
result += Environment.NewLine + Utils.Base64Decode(result2);
}
else
{
result += result2;
result += Environment.NewLine + result2;
}
}
}
@@ -243,21 +243,6 @@ public class UpdateService
_updateFunc?.Invoke(true, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, "geo"));
}
public async Task<string> RunAvailabilityCheck()
{
var downloadHandle = new DownloadService();
var time = await downloadHandle.RunAvailabilityCheck(null);
var ip = Global.None;
if (time > 0)
{
var result = await downloadHandle.TryDownloadString(Global.IPAPIUrl, true, Global.IPAPIUrl);
var ipInfo = JsonUtils.Deserialize<IPAPIInfo>(result);
ip = $"({ipInfo?.country_code}) {ipInfo?.ip}";
}
return string.Format(ResUI.TestMeOutput, time, ip);
}
#region CheckUpdate private
private async Task<RetResult> CheckUpdateAsync(DownloadService downloadHandle, ECoreType type, bool preRelease)

View File

@@ -70,6 +70,7 @@ public class OptionSettingViewModel : MyReactiveObject
[Reactive] public string GeoFileSourceUrl { get; set; }
[Reactive] public string SrsFileSourceUrl { get; set; }
[Reactive] public string RoutingRulesSourceUrl { get; set; }
[Reactive] public string IPAPIUrl { get; set; }
#endregion UI
@@ -186,6 +187,7 @@ public class OptionSettingViewModel : MyReactiveObject
GeoFileSourceUrl = _config.ConstItem.GeoSourceUrl;
SrsFileSourceUrl = _config.ConstItem.SrsSourceUrl;
RoutingRulesSourceUrl = _config.ConstItem.RouteRulesTemplateSourceUrl;
IPAPIUrl = _config.SpeedTestItem.IPAPIUrl;
#endregion UI
@@ -344,6 +346,7 @@ public class OptionSettingViewModel : MyReactiveObject
_config.ConstItem.GeoSourceUrl = GeoFileSourceUrl;
_config.ConstItem.SrsSourceUrl = SrsFileSourceUrl;
_config.ConstItem.RouteRulesTemplateSourceUrl = RoutingRulesSourceUrl;
_config.SpeedTestItem.IPAPIUrl = IPAPIUrl;
//systemProxy
_config.SystemProxyItem.SystemProxyExceptions = systemProxyExceptions;

View File

@@ -320,7 +320,7 @@ public class StatusBarViewModel : MyReactiveObject
var msg = await Task.Run(async () =>
{
return await (new UpdateService()).RunAvailabilityCheck();
return await ConnectionHandler.Instance.RunAvailabilityCheck();
});
NoticeHandler.Instance.SendMessageEx(msg);

View File

@@ -43,7 +43,7 @@ public partial class App : Application
{
if (e.ExceptionObject != null)
{
Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!);
Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
}

View File

@@ -51,12 +51,19 @@ public partial class ClashConnectionsView : ReactiveUserControl<ClashConnections
}
private void AutofitColumnWidth()
{
try
{
foreach (var it in lstConnections.Columns)
{
it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
}
}
catch (Exception ex)
{
Logging.SaveLog("ClashConnectionsView", ex);
}
}
private void btnClose_Click(object? sender, RoutedEventArgs e)
{

View File

@@ -388,7 +388,7 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
private async void MenuClose_Click(object? sender, RoutedEventArgs e)
{
if (await UI.ShowYesNo(this, ResUI.menuExitTips) == ButtonResult.No)
if (await UI.ShowYesNo(this, ResUI.menuExitTips) != ButtonResult.Yes)
{
return;
}

View File

@@ -343,7 +343,7 @@
<Grid
Margin="{StaticResource Margin4}"
ColumnDefinitions="Auto,Auto,*"
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<TextBlock
x:Name="tbAutoRun"
@@ -655,6 +655,20 @@
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsChinaUserTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="25"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSettingsIPAPIUrl}" />
<ComboBox
x:Name="cmbIPAPIUrl"
Grid.Row="25"
Grid.Column="1"
Width="300"
Margin="{StaticResource Margin4}" />
</Grid>
</ScrollViewer>
</TabItem>

View File

@@ -92,6 +92,10 @@ public partial class OptionSettingWindow : ReactiveWindow<OptionSettingViewModel
{
cmbRoutingRulesSourceUrl.Items.Add(it);
});
Global.IPAPIUrls.ForEach(it =>
{
cmbIPAPIUrl.Items.Add(it);
});
foreach (EGirdOrientation it in Enum.GetValues(typeof(EGirdOrientation)))
{
cmbMainGirdOrientation.Items.Add(it.ToString());
@@ -143,6 +147,7 @@ public partial class OptionSettingWindow : ReactiveWindow<OptionSettingViewModel
this.Bind(ViewModel, vm => vm.GeoFileSourceUrl, v => v.cmbGetFilesSourceUrl.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SrsFileSourceUrl, v => v.cmbSrsFilesSourceUrl.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RoutingRulesSourceUrl, v => v.cmbRoutingRulesSourceUrl.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.IPAPIUrl, v => v.cmbIPAPIUrl.SelectedValue).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.notProxyLocalAddress, v => v.tognotProxyLocalAddress.IsChecked).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.SelectedValue).DisposeWith(disposables);

View File

@@ -138,7 +138,7 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
break;
case EViewAction.ShowYesNo:
if (await UI.ShowYesNo(_window, ResUI.RemoveServer) == ButtonResult.No)
if (await UI.ShowYesNo(_window, ResUI.RemoveServer) != ButtonResult.Yes)
{
return false;
}
@@ -344,12 +344,19 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
}
private void AutofitColumnWidth()
{
try
{
foreach (var it in lstProfiles.Columns)
{
it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
}
}
catch (Exception ex)
{
Logging.SaveLog("ProfilesView", ex);
}
}
private void TxtServerFilter_KeyDown(object? sender, KeyEventArgs e)
{

View File

@@ -80,14 +80,14 @@ public partial class RoutingRuleSettingWindow : ReactiveWindow<RoutingRuleSettin
break;
case EViewAction.ShowYesNo:
if (await UI.ShowYesNo(this, ResUI.RemoveServer) == ButtonResult.No)
if (await UI.ShowYesNo(this, ResUI.RemoveServer) != ButtonResult.Yes)
{
return false;
}
break;
case EViewAction.AddBatchRoutingRulesYesNo:
if (await UI.ShowYesNo(this, ResUI.AddBatchRoutingRulesYesNo) == ButtonResult.No)
if (await UI.ShowYesNo(this, ResUI.AddBatchRoutingRulesYesNo) != ButtonResult.Yes)
{
return false;
}

View File

@@ -68,7 +68,7 @@ public partial class RoutingSettingWindow : ReactiveWindow<RoutingSettingViewMod
break;
case EViewAction.ShowYesNo:
if (await UI.ShowYesNo(this, ResUI.RemoveRules) == ButtonResult.No)
if (await UI.ShowYesNo(this, ResUI.RemoveRules) != ButtonResult.Yes)
{
return false;
}

View File

@@ -45,7 +45,7 @@ public partial class SubSettingWindow : ReactiveWindow<SubSettingViewModel>
break;
case EViewAction.ShowYesNo:
if (await UI.ShowYesNo(this, ResUI.RemoveServer) == ButtonResult.No)
if (await UI.ShowYesNo(this, ResUI.RemoveServer) != ButtonResult.Yes)
{
return false;
}

View File

@@ -56,7 +56,7 @@ public partial class App : Application
{
if (e.ExceptionObject != null)
{
Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!);
Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
}

View File

@@ -54,12 +54,19 @@ public partial class ClashConnectionsView
}
private void AutofitColumnWidth()
{
try
{
foreach (var it in lstConnections.Columns)
{
it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
}
}
catch (Exception ex)
{
Logging.SaveLog("ClashConnectionsView", ex);
}
}
private void btnClose_Click(object sender, System.Windows.RoutedEventArgs e)
{

View File

@@ -552,6 +552,7 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
@@ -942,6 +943,22 @@
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsChinaUserTip}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="25"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSettingsIPAPIUrl}" />
<ComboBox
x:Name="cmbIPAPIUrl"
Grid.Row="25"
Grid.Column="1"
Width="300"
Margin="{StaticResource Margin8}"
IsEditable="True"
Style="{StaticResource DefComboBox}" />
</Grid>
</ScrollViewer>
</TabItem>

View File

@@ -101,6 +101,10 @@ public partial class OptionSettingWindow
{
cmbRoutingRulesSourceUrl.Items.Add(it);
});
Global.IPAPIUrls.ForEach(it =>
{
cmbIPAPIUrl.Items.Add(it);
});
foreach (EGirdOrientation it in Enum.GetValues(typeof(EGirdOrientation)))
{
cmbMainGirdOrientation.Items.Add(it.ToString());
@@ -162,6 +166,7 @@ public partial class OptionSettingWindow
this.Bind(ViewModel, vm => vm.GeoFileSourceUrl, v => v.cmbGetFilesSourceUrl.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SrsFileSourceUrl, v => v.cmbSrsFilesSourceUrl.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RoutingRulesSourceUrl, v => v.cmbRoutingRulesSourceUrl.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.IPAPIUrl, v => v.cmbIPAPIUrl.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.notProxyLocalAddress, v => v.tognotProxyLocalAddress.IsChecked).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables);

View File

@@ -18,9 +18,6 @@
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
<conv:DelayColorConverter x:Key="DelayColorConverter" />
<Style x:Key="AccessibleMyChipListBoxItem" TargetType="ListBoxItem" BasedOn="{StaticResource MyChipListBoxItem}">
<Setter Property="AutomationProperties.Name" Value="{Binding Remarks}" />
</Style>
</UserControl.Resources>
<Grid>
<DockPanel>
@@ -28,10 +25,10 @@
<ListBox
x:Name="lstGroup"
MaxHeight="200"
AutomationProperties.Name="{x:Static resx:ResUI.menuSubscription}"
FontSize="{DynamicResource StdFontSize}"
ItemContainerStyle="{StaticResource AccessibleMyChipListBoxItem}"
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}"
AutomationProperties.Name="{x:Static resx:ResUI.menuSubscription}">
ItemContainerStyle="{StaticResource MyChipListBoxItem}"
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Remarks}" />

View File

@@ -322,12 +322,19 @@ public partial class ProfilesView
}
private void AutofitColumnWidth()
{
try
{
foreach (var it in lstProfiles.Columns)
{
it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
}
}
catch (Exception ex)
{
Logging.SaveLog("ProfilesView", ex);
}
}
private void TxtServerFilter_PreviewKeyDown(object sender, KeyEventArgs e)
{

View File

@@ -93,11 +93,6 @@
DisplayMemberPath="Remarks"
FontSize="{DynamicResource StdFontSize}"
Style="{StaticResource MaterialDesignFloatingHintComboBox}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="AutomationProperties.Name" Value="{Binding Remarks}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</StackPanel>
@@ -191,11 +186,6 @@
DisplayMemberPath="Remarks"
FontSize="{DynamicResource StdFontSize}"
Style="{StaticResource MaterialDesignFilledComboBox}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="AutomationProperties.Name" Value="{Binding Remarks}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</DockPanel>
</MenuItem.Header>
@@ -211,11 +201,6 @@
DisplayMemberPath="Text"
FontSize="{DynamicResource StdFontSize}"
Style="{StaticResource MaterialDesignFilledComboBox}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="AutomationProperties.Name" Value="{Binding Text}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</DockPanel>
</MenuItem.Header>