This commit is contained in:
DHR60 2026-02-01 15:34:50 +08:00 committed by GitHub
commit 6c07239270
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 364 additions and 276 deletions

View file

@ -462,6 +462,18 @@ public class Utils
return (domain, port); return (domain, port);
} }
public static string? DomainStrategy4Sbox(string? strategy)
{
return strategy switch
{
not null when strategy.StartsWith("UseIPv4") => "prefer_ipv4",
not null when strategy.StartsWith("UseIPv6") => "prefer_ipv6",
not null when strategy.StartsWith("ForceIPv4") => "ipv4_only",
not null when strategy.StartsWith("ForceIPv6") => "ipv6_only",
_ => null
};
}
#endregion Conversion Functions #endregion Conversion Functions
#region Data Checks #region Data Checks

View file

@ -329,13 +329,13 @@ public class Global
IPOnDemand IPOnDemand
]; ];
public static readonly List<string> DomainStrategies4Singbox = public static readonly List<string> DomainStrategies4Sbox =
[ [
"ipv4_only", "",
"ipv6_only",
"prefer_ipv4", "prefer_ipv4",
"prefer_ipv6", "prefer_ipv6",
"" "ipv4_only",
"ipv6_only"
]; ];
public static readonly List<string> Fingerprints = public static readonly List<string> Fingerprints =
@ -377,28 +377,22 @@ public class Global
"" ""
]; ];
public static readonly List<string> DomainStrategy4Freedoms = public static readonly List<string> DomainStrategy =
[ [
"AsIs", "AsIs",
"UseIP", "UseIP",
"UseIPv4v6",
"UseIPv6v4",
"UseIPv4", "UseIPv4",
"UseIPv6", "UseIPv6",
"" ""
]; ];
public static readonly List<string> SingboxDomainStrategy4Out =
[
"",
"ipv4_only",
"prefer_ipv4",
"prefer_ipv6",
"ipv6_only"
];
public static readonly List<string> DomainDirectDNSAddress = public static readonly List<string> DomainDirectDNSAddress =
[ [
"https://dns.alidns.com/dns-query", "https://dns.alidns.com/dns-query",
"https://doh.pub/dns-query", "https://doh.pub/dns-query",
"https://dns.alidns.com/dns-query,https://doh.pub/dns-query",
"223.5.5.5", "223.5.5.5",
"119.29.29.29", "119.29.29.29",
"localhost" "localhost"
@ -407,8 +401,9 @@ public class Global
public static readonly List<string> DomainRemoteDNSAddress = public static readonly List<string> DomainRemoteDNSAddress =
[ [
"https://cloudflare-dns.com/dns-query", "https://cloudflare-dns.com/dns-query",
"https://dns.cloudflare.com/dns-query",
"https://dns.google/dns-query", "https://dns.google/dns-query",
"https://cloudflare-dns.com/dns-query,https://dns.google/dns-query,8.8.8.8",
"https://dns.cloudflare.com/dns-query",
"https://doh.dns.sb/dns-query", "https://doh.dns.sb/dns-query",
"https://doh.opendns.com/dns-query", "https://doh.opendns.com/dns-query",
"https://common.dot.dns.yandex.net", "https://common.dot.dns.yandex.net",

View file

@ -114,6 +114,8 @@ public static class ConfigHandler
config.SimpleDNSItem ??= InitBuiltinSimpleDNS(); config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
config.SimpleDNSItem.GlobalFakeIp ??= true; config.SimpleDNSItem.GlobalFakeIp ??= true;
config.SimpleDNSItem.BootstrapDNS ??= Global.DomainPureIPDNSAddress.FirstOrDefault(); config.SimpleDNSItem.BootstrapDNS ??= Global.DomainPureIPDNSAddress.FirstOrDefault();
config.SimpleDNSItem.ServeStale ??= false;
config.SimpleDNSItem.ParallelQuery ??= false;
config.SpeedTestItem ??= new(); config.SpeedTestItem ??= new();
if (config.SpeedTestItem.SpeedTestTimeout < 10) if (config.SpeedTestItem.SpeedTestTimeout < 10)

View file

@ -265,9 +265,10 @@ public class SimpleDNSItem
public string? DirectDNS { get; set; } public string? DirectDNS { get; set; }
public string? RemoteDNS { get; set; } public string? RemoteDNS { get; set; }
public string? BootstrapDNS { get; set; } public string? BootstrapDNS { get; set; }
public string? RayStrategy4Freedom { get; set; } public string? Strategy4Freedom { get; set; }
public string? SingboxStrategy4Direct { get; set; } public string? Strategy4Proxy { get; set; }
public string? SingboxStrategy4Proxy { get; set; } public bool? ServeStale { get; set; }
public bool? ParallelQuery { get; set; }
public string? Hosts { get; set; } public string? Hosts { get; set; }
public string? DirectExpectedIPs { get; set; } public string? DirectExpectedIPs { get; set; }
} }

View file

@ -3,7 +3,7 @@ namespace ServiceLib.Models;
public class V2rayConfig public class V2rayConfig
{ {
public Log4Ray log { get; set; } public Log4Ray log { get; set; }
public Dns4Ray dns { get; set; } public object dns { get; set; }
public List<Inbounds4Ray> inbounds { get; set; } public List<Inbounds4Ray> inbounds { get; set; }
public List<Outbounds4Ray> outbounds { get; set; } public List<Outbounds4Ray> outbounds { get; set; }
public Routing4Ray routing { get; set; } public Routing4Ray routing { get; set; }
@ -105,6 +105,8 @@ public class Outbounds4Ray
public string protocol { get; set; } public string protocol { get; set; }
public string? targetStrategy { get; set; }
public Outboundsettings4Ray settings { get; set; } public Outboundsettings4Ray settings { get; set; }
public StreamSettings4Ray streamSettings { get; set; } public StreamSettings4Ray streamSettings { get; set; }
@ -206,12 +208,8 @@ public class Dns4Ray
{ {
public Dictionary<string, object>? hosts { get; set; } public Dictionary<string, object>? hosts { get; set; }
public List<object> servers { get; set; } public List<object> servers { get; set; }
public string? clientIp { get; set; } public bool? serveStale { get; set; }
public string? queryStrategy { get; set; } public bool? enableParallelQuery { get; set; }
public bool? disableCache { get; set; }
public bool? disableFallback { get; set; }
public bool? disableFallbackIfMatch { get; set; }
public bool? useSystemHosts { get; set; }
public string? tag { get; set; } public string? tag { get; set; }
} }

View file

@ -2727,6 +2727,15 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 Direct Resolution Strategy 的本地化字符串。
/// </summary>
public static string TbDirectResolveStrategy {
get {
return ResourceManager.GetString("TbDirectResolveStrategy", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 Display GUI 的本地化字符串。 /// 查找类似 Display GUI 的本地化字符串。
/// </summary> /// </summary>
@ -3060,6 +3069,15 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 Parallel Query 的本地化字符串。
/// </summary>
public static string TbParallelQuery {
get {
return ResourceManager.GetString("TbParallelQuery", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 Path 的本地化字符串。 /// 查找类似 Path 的本地化字符串。
/// </summary> /// </summary>
@ -3222,6 +3240,15 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 Remote Resolution Strategy 的本地化字符串。
/// </summary>
public static string TbRemoteResolveStrategy {
get {
return ResourceManager.GetString("TbRemoteResolveStrategy", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 Camouflage domain(host) 的本地化字符串。 /// 查找类似 Camouflage domain(host) 的本地化字符串。
/// </summary> /// </summary>
@ -3357,15 +3384,6 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 sing-box Direct Resolution Strategy 的本地化字符串。
/// </summary>
public static string TbSBDirectResolveStrategy {
get {
return ResourceManager.GetString("TbSBDirectResolveStrategy", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 sing-box Full Config Template 的本地化字符串。 /// 查找类似 sing-box Full Config Template 的本地化字符串。
/// </summary> /// </summary>
@ -3384,15 +3402,6 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 sing-box Remote Resolution Strategy 的本地化字符串。
/// </summary>
public static string TbSBRemoteResolveStrategy {
get {
return ResourceManager.GetString("TbSBRemoteResolveStrategy", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 Encryption method (security) 的本地化字符串。 /// 查找类似 Encryption method (security) 的本地化字符串。
/// </summary> /// </summary>
@ -3438,6 +3447,15 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 Serve Stale 的本地化字符串。
/// </summary>
public static string TbServeStale {
get {
return ResourceManager.GetString("TbServeStale", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 Set system proxy 的本地化字符串。 /// 查找类似 Set system proxy 的本地化字符串。
/// </summary> /// </summary>
@ -4419,15 +4437,6 @@ namespace ServiceLib.Resx {
} }
} }
/// <summary>
/// 查找类似 xray Freedom Resolution Strategy 的本地化字符串。
/// </summary>
public static string TbXrayFreedomStrategy {
get {
return ResourceManager.GetString("TbXrayFreedomStrategy", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 The delay: {0} ms, {1} 的本地化字符串。 /// 查找类似 The delay: {0} ms, {1} 的本地化字符串。
/// </summary> /// </summary>

View file

@ -1422,14 +1422,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>Via proxy — please ensure remote availability</value> <value>Via proxy — please ensure remote availability</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>Direct Resolution Strategy</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Direct Resolution Strategy</value> <value>Remote Resolution Strategy</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Remote Resolution Strategy</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
@ -1653,4 +1650,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -1419,14 +1419,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>Via le proxy ; assurez-vous que le serveur distant est disponible</value> <value>Via le proxy ; assurez-vous que le serveur distant est disponible</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>Stratégie de résolution xray freedom</value> <value>Stratégie de résolution directe</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>Stratégie de résolution directe sing-box</value> <value>Stratégie de résolution distante</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>Stratégie de résolution distante sing-box</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Ajouter des hôtes DNS courants</value> <value>Ajouter des hôtes DNS courants</value>
@ -1650,4 +1647,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -1422,14 +1422,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>Via proxy — please ensure remote availability</value> <value>Via proxy — please ensure remote availability</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>Direct Resolution Strategy</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Direct Resolution Strategy</value> <value>Remote Resolution Strategy</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Remote Resolution Strategy</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
@ -1653,4 +1650,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -1422,14 +1422,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>Via proxy — please ensure remote availability</value> <value>Via proxy — please ensure remote availability</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>Direct Resolution Strategy</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Direct Resolution Strategy</value> <value>Remote Resolution Strategy</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>sing-box Remote Resolution Strategy</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
@ -1653,4 +1650,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -1422,14 +1422,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>Via proxy — please ensure remote availability</value> <value>Via proxy — please ensure remote availability</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>Стратегия резолвинга Freedom (Xray)</value> <value>Стратегия прямого резолвинга</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>Стратегия прямого резолвинга (sing-box)</value> <value>Стратегия удалённого резолвинга</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>Стратегия удалённого резолвинга (sing-box)</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Добавить стандартные записи hosts (DNS)</value> <value>Добавить стандартные записи hosts (DNS)</value>
@ -1653,4 +1650,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -1419,14 +1419,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>通过代理,请确保远程可用</value> <value>通过代理,请确保远程可用</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>xray freedom 解析策略</value> <value>直连解析策略</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>sing-box 直连解析策略</value> <value>远程解析策略</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>sing-box 远程解析策略</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>添加常用 DNS Hosts</value> <value>添加常用 DNS Hosts</value>
@ -1650,4 +1647,10 @@
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>证书指纹SHA-256</value> <value>证书指纹SHA-256</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>乐观缓存</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>并行查询</value>
</data>
</root> </root>

View file

@ -1419,14 +1419,11 @@
<data name="TbRemoteDNSTips" xml:space="preserve"> <data name="TbRemoteDNSTips" xml:space="preserve">
<value>通过代理,请确保远程可用</value> <value>通过代理,请确保远程可用</value>
</data> </data>
<data name="TbXrayFreedomStrategy" xml:space="preserve"> <data name="TbDirectResolveStrategy" xml:space="preserve">
<value>xray freedom 解析策略</value> <value>直連解析策略</value>
</data> </data>
<data name="TbSBDirectResolveStrategy" xml:space="preserve"> <data name="TbRemoteResolveStrategy" xml:space="preserve">
<value>sing-box 直連解析策略</value> <value>遠程解析策略</value>
</data>
<data name="TbSBRemoteResolveStrategy" xml:space="preserve">
<value>sing-box 遠程解析策略</value>
</data> </data>
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>新增常用 DNS Hosts</value> <value>新增常用 DNS Hosts</value>
@ -1650,4 +1647,10 @@
<data name="TbCertSha256Tips" xml:space="preserve"> <data name="TbCertSha256Tips" xml:space="preserve">
<value>Certificate fingerprint (SHA-256)</value> <value>Certificate fingerprint (SHA-256)</value>
</data> </data>
<data name="TbServeStale" xml:space="preserve">
<value>Serve Stale</value>
</data>
<data name="TbParallelQuery" xml:space="preserve">
<value>Parallel Query</value>
</data>
</root> </root>

View file

@ -175,18 +175,18 @@ public partial class CoreConfigSingboxService
singboxConfig.dns.rules ??= new List<Rule4Sbox>(); singboxConfig.dns.rules ??= new List<Rule4Sbox>();
singboxConfig.dns.rules.AddRange(new[] singboxConfig.dns.rules.AddRange(new[]
{ {
new Rule4Sbox { ip_accept_any = true, server = Global.SingboxHostsDNSTag }, new Rule4Sbox { ip_accept_any = true, server = Global.SingboxHostsDNSTag },
new Rule4Sbox new Rule4Sbox
{ {
server = Global.SingboxRemoteDNSTag, server = Global.SingboxRemoteDNSTag,
strategy = simpleDNSItem.SingboxStrategy4Proxy.NullIfEmpty(), strategy = Utils.DomainStrategy4Sbox(simpleDNSItem.Strategy4Proxy),
clash_mode = ERuleMode.Global.ToString() clash_mode = ERuleMode.Global.ToString()
}, },
new Rule4Sbox new Rule4Sbox
{ {
server = Global.SingboxDirectDNSTag, server = Global.SingboxDirectDNSTag,
strategy = simpleDNSItem.SingboxStrategy4Direct.NullIfEmpty(), strategy = Utils.DomainStrategy4Sbox(simpleDNSItem.Strategy4Freedom),
clash_mode = ERuleMode.Direct.ToString() clash_mode = ERuleMode.Direct.ToString()
} }
}); });
@ -309,7 +309,7 @@ public partial class CoreConfigSingboxService
if (item.OutboundTag == Global.DirectTag) if (item.OutboundTag == Global.DirectTag)
{ {
rule.server = Global.SingboxDirectDNSTag; rule.server = Global.SingboxDirectDNSTag;
rule.strategy = string.IsNullOrEmpty(simpleDNSItem.SingboxStrategy4Direct) ? null : simpleDNSItem.SingboxStrategy4Direct; rule.strategy = Utils.DomainStrategy4Sbox(simpleDNSItem.Strategy4Freedom);
if (expectedIPsRegions.Count > 0 && rule.geosite?.Count > 0) if (expectedIPsRegions.Count > 0 && rule.geosite?.Count > 0)
{ {
@ -343,7 +343,7 @@ public partial class CoreConfigSingboxService
singboxConfig.dns.rules.Add(rule4Fake); singboxConfig.dns.rules.Add(rule4Fake);
} }
rule.server = Global.SingboxRemoteDNSTag; rule.server = Global.SingboxRemoteDNSTag;
rule.strategy = string.IsNullOrEmpty(simpleDNSItem.SingboxStrategy4Proxy) ? null : simpleDNSItem.SingboxStrategy4Proxy; rule.strategy = Utils.DomainStrategy4Sbox(simpleDNSItem.Strategy4Proxy);
} }
singboxConfig.dns.rules.Add(rule); singboxConfig.dns.rules.Add(rule);

View file

@ -7,21 +7,21 @@ public partial class CoreConfigSingboxService
try try
{ {
singboxConfig.route.final = Global.ProxyTag; singboxConfig.route.final = Global.ProxyTag;
var item = _config.SimpleDNSItem; var simpleDnsItem = _config.SimpleDNSItem;
var defaultDomainResolverTag = Global.SingboxDirectDNSTag; var defaultDomainResolverTag = Global.SingboxDirectDNSTag;
var directDNSStrategy = item.SingboxStrategy4Direct.IsNullOrEmpty() ? Global.SingboxDomainStrategy4Out.FirstOrDefault() : item.SingboxStrategy4Direct; var directDnsStrategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom);
var rawDNSItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box); var rawDNSItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box);
if (rawDNSItem != null && rawDNSItem.Enabled == true) if (rawDNSItem is { Enabled: true })
{ {
defaultDomainResolverTag = Global.SingboxLocalDNSTag; defaultDomainResolverTag = Global.SingboxLocalDNSTag;
directDNSStrategy = rawDNSItem.DomainStrategy4Freedom.IsNullOrEmpty() ? Global.SingboxDomainStrategy4Out.FirstOrDefault() : rawDNSItem.DomainStrategy4Freedom; directDnsStrategy = rawDNSItem.DomainStrategy4Freedom.IsNullOrEmpty() ? null : rawDNSItem.DomainStrategy4Freedom;
} }
singboxConfig.route.default_domain_resolver = new() singboxConfig.route.default_domain_resolver = new()
{ {
server = defaultDomainResolverTag, server = defaultDomainResolverTag,
strategy = directDNSStrategy strategy = directDnsStrategy
}; };
if (_config.TunModeItem.EnableTun) if (_config.TunModeItem.EnableTun)
@ -73,18 +73,17 @@ public partial class CoreConfigSingboxService
var hostsDomains = new List<string>(); var hostsDomains = new List<string>();
var dnsItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box); var dnsItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box);
if (dnsItem == null || dnsItem.Enabled == false) if (dnsItem == null || !dnsItem.Enabled)
{ {
var simpleDNSItem = _config.SimpleDNSItem; if (!simpleDnsItem.Hosts.IsNullOrEmpty())
if (!simpleDNSItem.Hosts.IsNullOrEmpty())
{ {
var userHostsMap = Utils.ParseHostsToDictionary(simpleDNSItem.Hosts); var userHostsMap = Utils.ParseHostsToDictionary(simpleDnsItem.Hosts);
foreach (var kvp in userHostsMap) foreach (var kvp in userHostsMap)
{ {
hostsDomains.Add(kvp.Key); hostsDomains.Add(kvp.Key);
} }
} }
if (simpleDNSItem.UseSystemHosts == true) if (simpleDnsItem.UseSystemHosts == true)
{ {
var systemHostsMap = Utils.GetSystemHosts(); var systemHostsMap = Utils.GetSystemHosts();
foreach (var kvp in systemHostsMap) foreach (var kvp in systemHostsMap)

View file

@ -7,48 +7,74 @@ public partial class CoreConfigV2rayService
try try
{ {
var item = await AppManager.Instance.GetDNSItem(ECoreType.Xray); var item = await AppManager.Instance.GetDNSItem(ECoreType.Xray);
if (item != null && item.Enabled == true) if (item is { Enabled: true })
{ {
var result = await GenDnsCompatible(node, v2rayConfig); var result = await GenDnsCompatible(node, v2rayConfig);
if (v2rayConfig.routing.domainStrategy == Global.IPIfNonMatch) if (v2rayConfig.routing.domainStrategy != Global.IPIfNonMatch)
{ {
// DNS routing return result;
v2rayConfig.dns.tag = Global.DnsTag;
v2rayConfig.routing.rules.Add(new RulesItem4Ray
{
type = "field",
inboundTag = new List<string> { Global.DnsTag },
outboundTag = Global.ProxyTag,
});
} }
// DNS routing
var dnsObj = JsonUtils.SerializeToNode(v2rayConfig.dns);
if (dnsObj == null)
{
return result;
}
dnsObj["tag"] = Global.DnsTag;
v2rayConfig.dns = JsonUtils.Deserialize<Dns4Ray>(JsonUtils.Serialize(dnsObj));
v2rayConfig.routing.rules.Add(new RulesItem4Ray
{
type = "field",
inboundTag = new List<string> { Global.DnsTag },
outboundTag = Global.ProxyTag,
});
return result; return result;
} }
var simpleDNSItem = _config.SimpleDNSItem; var simpleDnsItem = _config.SimpleDNSItem;
var domainStrategy4Freedom = simpleDNSItem?.RayStrategy4Freedom; var dnsItem = v2rayConfig.dns is Dns4Ray dns4Ray ? dns4Ray : new Dns4Ray();
var strategy4Freedom = simpleDnsItem?.Strategy4Freedom ?? Global.AsIs;
//Outbound Freedom domainStrategy //Outbound Freedom domainStrategy
if (domainStrategy4Freedom.IsNotEmpty()) if (strategy4Freedom.IsNotEmpty() && strategy4Freedom != Global.AsIs)
{ {
var outbound = v2rayConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag }); var outbound = v2rayConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
if (outbound != null) if (outbound != null)
{ {
outbound.settings = new() outbound.settings = new()
{ {
domainStrategy = domainStrategy4Freedom, domainStrategy = strategy4Freedom,
userLevel = 0 userLevel = 0
}; };
} }
} }
await GenDnsServers(node, v2rayConfig, simpleDNSItem); var strategy4Proxy = simpleDnsItem?.Strategy4Proxy ?? Global.AsIs;
await GenDnsHosts(v2rayConfig, simpleDNSItem); //Outbound Proxy domainStrategy
if (strategy4Proxy.IsNotEmpty() && strategy4Proxy != Global.AsIs)
{
var xraySupportConfigTypeNames = Global.XraySupportConfigType
.Select(x => x == EConfigType.Hysteria2 ? "hysteria" : Global.ProtocolTypes[x])
.ToHashSet();
v2rayConfig.outbounds
.Where(t => xraySupportConfigTypeNames.Contains(t.protocol))
.ToList()
.ForEach(outbound => outbound.targetStrategy = strategy4Proxy);
}
await GenDnsServers(node, dnsItem, simpleDnsItem);
await GenDnsHosts(dnsItem, simpleDnsItem);
dnsItem.serveStale = simpleDnsItem?.ServeStale is true ? true : null;
dnsItem.enableParallelQuery = simpleDnsItem?.ParallelQuery is true ? true : null;
if (v2rayConfig.routing.domainStrategy == Global.IPIfNonMatch) if (v2rayConfig.routing.domainStrategy == Global.IPIfNonMatch)
{ {
// DNS routing // DNS routing
v2rayConfig.dns.tag = Global.DnsTag; dnsItem.tag = Global.DnsTag;
v2rayConfig.routing.rules.Add(new RulesItem4Ray v2rayConfig.routing.rules.Add(new RulesItem4Ray
{ {
type = "field", type = "field",
@ -56,6 +82,8 @@ public partial class CoreConfigV2rayService
outboundTag = Global.ProxyTag, outboundTag = Global.ProxyTag,
}); });
} }
v2rayConfig.dns = dnsItem;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -64,7 +92,7 @@ public partial class CoreConfigV2rayService
return 0; return 0;
} }
private async Task<int> GenDnsServers(ProfileItem? node, V2rayConfig v2rayConfig, SimpleDNSItem simpleDNSItem) private async Task<int> GenDnsServers(ProfileItem? node, Dns4Ray dnsItem, SimpleDNSItem simpleDNSItem)
{ {
static List<string> ParseDnsAddresses(string? dnsInput, string defaultAddress) static List<string> ParseDnsAddresses(string? dnsInput, string defaultAddress)
{ {
@ -77,7 +105,7 @@ public partial class CoreConfigV2rayService
return addresses.Count > 0 ? addresses : new List<string> { defaultAddress }; return addresses.Count > 0 ? addresses : new List<string> { defaultAddress };
} }
static object CreateDnsServer(string dnsAddress, List<string> domains, List<string>? expectedIPs = null) static object? CreateDnsServer(string dnsAddress, List<string> domains, List<string>? expectedIPs = null)
{ {
var (domain, scheme, port, path) = Utils.ParseUrl(dnsAddress); var (domain, scheme, port, path) = Utils.ParseUrl(dnsAddress);
var domainFinal = dnsAddress; var domainFinal = dnsAddress;
@ -106,8 +134,8 @@ public partial class CoreConfigV2rayService
}); });
} }
var directDNSAddress = ParseDnsAddresses(simpleDNSItem?.DirectDNS, Global.DomainDirectDNSAddress.FirstOrDefault()); var directDNSAddress = ParseDnsAddresses(simpleDNSItem?.DirectDNS, Global.DomainDirectDNSAddress.First());
var remoteDNSAddress = ParseDnsAddresses(simpleDNSItem?.RemoteDNS, Global.DomainRemoteDNSAddress.FirstOrDefault()); var remoteDNSAddress = ParseDnsAddresses(simpleDNSItem?.RemoteDNS, Global.DomainRemoteDNSAddress.First());
var directDomainList = new List<string>(); var directDomainList = new List<string>();
var directGeositeList = new List<string>(); var directGeositeList = new List<string>();
@ -117,7 +145,7 @@ public partial class CoreConfigV2rayService
var expectedIPs = new List<string>(); var expectedIPs = new List<string>();
var regionNames = new HashSet<string>(); var regionNames = new HashSet<string>();
var bootstrapDNSAddress = ParseDnsAddresses(simpleDNSItem?.BootstrapDNS, Global.DomainPureIPDNSAddress.FirstOrDefault()); var bootstrapDNSAddress = ParseDnsAddresses(simpleDNSItem?.BootstrapDNS, Global.DomainPureIPDNSAddress.First());
var dnsServerDomains = new List<string>(); var dnsServerDomains = new List<string>();
foreach (var dns in directDNSAddress) foreach (var dns in directDNSAddress)
@ -171,51 +199,48 @@ public partial class CoreConfigV2rayService
var routing = await ConfigHandler.GetDefaultRouting(_config); var routing = await ConfigHandler.GetDefaultRouting(_config);
List<RulesItem>? rules = null; List<RulesItem>? rules = null;
if (routing != null) rules = JsonUtils.Deserialize<List<RulesItem>>(routing.RuleSet) ?? [];
foreach (var item in rules)
{ {
rules = JsonUtils.Deserialize<List<RulesItem>>(routing.RuleSet) ?? []; if (!item.Enabled || item.Domain is null || item.Domain.Count == 0)
foreach (var item in rules)
{ {
if (!item.Enabled || item.Domain is null || item.Domain.Count == 0) continue;
}
if (item.RuleType == ERuleType.Routing)
{
continue;
}
foreach (var domain in item.Domain)
{
if (domain.StartsWith('#'))
{ {
continue; continue;
} }
if (item.RuleType == ERuleType.Routing) var normalizedDomain = domain.Replace(Global.RoutingRuleComma, ",");
if (item.OutboundTag == Global.DirectTag)
{ {
continue; if (normalizedDomain.StartsWith("geosite:") || normalizedDomain.StartsWith("ext:"))
{
(regionNames.Contains(normalizedDomain) ? expectedDomainList : directGeositeList).Add(normalizedDomain);
}
else
{
directDomainList.Add(normalizedDomain);
}
} }
else if (item.OutboundTag != Global.BlockTag)
foreach (var domain in item.Domain)
{ {
if (domain.StartsWith('#')) if (normalizedDomain.StartsWith("geosite:") || normalizedDomain.StartsWith("ext:"))
{ {
continue; proxyGeositeList.Add(normalizedDomain);
} }
else
var normalizedDomain = domain.Replace(Global.RoutingRuleComma, ",");
if (item.OutboundTag == Global.DirectTag)
{ {
if (normalizedDomain.StartsWith("geosite:") || normalizedDomain.StartsWith("ext:")) proxyDomainList.Add(normalizedDomain);
{
(regionNames.Contains(normalizedDomain) ? expectedDomainList : directGeositeList).Add(normalizedDomain);
}
else
{
directDomainList.Add(normalizedDomain);
}
}
else if (item.OutboundTag != Global.BlockTag)
{
if (normalizedDomain.StartsWith("geosite:") || normalizedDomain.StartsWith("ext:"))
{
proxyGeositeList.Add(normalizedDomain);
}
else
{
proxyDomainList.Add(normalizedDomain);
}
} }
} }
} }
@ -244,8 +269,7 @@ public partial class CoreConfigV2rayService
} }
} }
v2rayConfig.dns ??= new Dns4Ray(); dnsItem.servers ??= [];
v2rayConfig.dns.servers ??= new List<object>();
void AddDnsServers(List<string> dnsAddresses, List<string> domains, List<string>? expectedIPs = null) void AddDnsServers(List<string> dnsAddresses, List<string> domains, List<string>? expectedIPs = null)
{ {
@ -253,7 +277,7 @@ public partial class CoreConfigV2rayService
{ {
foreach (var dnsAddress in dnsAddresses) foreach (var dnsAddress in dnsAddresses)
{ {
v2rayConfig.dns.servers.Add(CreateDnsServer(dnsAddress, domains, expectedIPs)); dnsItem.servers.Add(CreateDnsServer(dnsAddress, domains, expectedIPs));
} }
} }
} }
@ -275,22 +299,21 @@ public partial class CoreConfigV2rayService
|| lastRule.Ip?.Contains("0.0.0.0/0") == true); || lastRule.Ip?.Contains("0.0.0.0/0") == true);
var defaultDnsServers = useDirectDns ? directDNSAddress : remoteDNSAddress; var defaultDnsServers = useDirectDns ? directDNSAddress : remoteDNSAddress;
v2rayConfig.dns.servers.AddRange(defaultDnsServers); dnsItem.servers.AddRange(defaultDnsServers);
return 0; return 0;
} }
private async Task<int> GenDnsHosts(V2rayConfig v2rayConfig, SimpleDNSItem simpleDNSItem) private async Task<int> GenDnsHosts(Dns4Ray dnsItem, SimpleDNSItem simpleDNSItem)
{ {
if (simpleDNSItem.AddCommonHosts == false && simpleDNSItem.UseSystemHosts == false && simpleDNSItem.Hosts.IsNullOrEmpty()) if (simpleDNSItem.AddCommonHosts == false && simpleDNSItem.UseSystemHosts == false && simpleDNSItem.Hosts.IsNullOrEmpty())
{ {
return await Task.FromResult(0); return await Task.FromResult(0);
} }
v2rayConfig.dns ??= new Dns4Ray(); dnsItem.hosts ??= new Dictionary<string, object>();
v2rayConfig.dns.hosts ??= new Dictionary<string, object>();
if (simpleDNSItem.AddCommonHosts == true) if (simpleDNSItem.AddCommonHosts == true)
{ {
v2rayConfig.dns.hosts = Global.PredefinedHosts.ToDictionary( dnsItem.hosts = Global.PredefinedHosts.ToDictionary(
kvp => kvp.Key, kvp => kvp.Key,
kvp => (object)kvp.Value kvp => (object)kvp.Value
); );
@ -299,7 +322,7 @@ public partial class CoreConfigV2rayService
if (simpleDNSItem.UseSystemHosts == true) if (simpleDNSItem.UseSystemHosts == true)
{ {
var systemHosts = Utils.GetSystemHosts(); var systemHosts = Utils.GetSystemHosts();
var normalHost = v2rayConfig?.dns?.hosts; var normalHost = dnsItem.hosts;
if (normalHost != null && systemHosts?.Count > 0) if (normalHost != null && systemHosts?.Count > 0)
{ {
@ -316,7 +339,7 @@ public partial class CoreConfigV2rayService
foreach (var kvp in userHostsMap) foreach (var kvp in userHostsMap)
{ {
v2rayConfig.dns.hosts[kvp.Key] = kvp.Value; dnsItem.hosts[kvp.Key] = kvp.Value;
} }
} }
return await Task.FromResult(0); return await Task.FromResult(0);

View file

@ -9,11 +9,12 @@ public class DNSSettingViewModel : MyReactiveObject
[Reactive] public string? DirectDNS { get; set; } [Reactive] public string? DirectDNS { get; set; }
[Reactive] public string? RemoteDNS { get; set; } [Reactive] public string? RemoteDNS { get; set; }
[Reactive] public string? BootstrapDNS { get; set; } [Reactive] public string? BootstrapDNS { get; set; }
[Reactive] public string? RayStrategy4Freedom { get; set; } [Reactive] public string? Strategy4Freedom { get; set; }
[Reactive] public string? SingboxStrategy4Direct { get; set; } [Reactive] public string? Strategy4Proxy { get; set; }
[Reactive] public string? SingboxStrategy4Proxy { get; set; }
[Reactive] public string? Hosts { get; set; } [Reactive] public string? Hosts { get; set; }
[Reactive] public string? DirectExpectedIPs { get; set; } [Reactive] public string? DirectExpectedIPs { get; set; }
[Reactive] public bool? ParallelQuery { get; set; }
[Reactive] public bool? ServeStale { get; set; }
[Reactive] public bool UseSystemHostsCompatible { get; set; } [Reactive] public bool UseSystemHostsCompatible { get; set; }
[Reactive] public string DomainStrategy4FreedomCompatible { get; set; } [Reactive] public string DomainStrategy4FreedomCompatible { get; set; }
@ -70,11 +71,12 @@ public class DNSSettingViewModel : MyReactiveObject
DirectDNS = item.DirectDNS; DirectDNS = item.DirectDNS;
RemoteDNS = item.RemoteDNS; RemoteDNS = item.RemoteDNS;
BootstrapDNS = item.BootstrapDNS; BootstrapDNS = item.BootstrapDNS;
RayStrategy4Freedom = item.RayStrategy4Freedom; Strategy4Freedom = item.Strategy4Freedom;
SingboxStrategy4Direct = item.SingboxStrategy4Direct; Strategy4Proxy = item.Strategy4Proxy;
SingboxStrategy4Proxy = item.SingboxStrategy4Proxy;
Hosts = item.Hosts; Hosts = item.Hosts;
DirectExpectedIPs = item.DirectExpectedIPs; DirectExpectedIPs = item.DirectExpectedIPs;
ParallelQuery = item.ParallelQuery;
ServeStale = item.ServeStale;
var item1 = await AppManager.Instance.GetDNSItem(ECoreType.Xray); var item1 = await AppManager.Instance.GetDNSItem(ECoreType.Xray);
RayCustomDNSEnableCompatible = item1.Enabled; RayCustomDNSEnableCompatible = item1.Enabled;
@ -100,11 +102,12 @@ public class DNSSettingViewModel : MyReactiveObject
_config.SimpleDNSItem.DirectDNS = DirectDNS; _config.SimpleDNSItem.DirectDNS = DirectDNS;
_config.SimpleDNSItem.RemoteDNS = RemoteDNS; _config.SimpleDNSItem.RemoteDNS = RemoteDNS;
_config.SimpleDNSItem.BootstrapDNS = BootstrapDNS; _config.SimpleDNSItem.BootstrapDNS = BootstrapDNS;
_config.SimpleDNSItem.RayStrategy4Freedom = RayStrategy4Freedom; _config.SimpleDNSItem.Strategy4Freedom = Strategy4Freedom;
_config.SimpleDNSItem.SingboxStrategy4Direct = SingboxStrategy4Direct; _config.SimpleDNSItem.Strategy4Proxy = Strategy4Proxy;
_config.SimpleDNSItem.SingboxStrategy4Proxy = SingboxStrategy4Proxy;
_config.SimpleDNSItem.Hosts = Hosts; _config.SimpleDNSItem.Hosts = Hosts;
_config.SimpleDNSItem.DirectExpectedIPs = DirectExpectedIPs; _config.SimpleDNSItem.DirectExpectedIPs = DirectExpectedIPs;
_config.SimpleDNSItem.ParallelQuery = ParallelQuery;
_config.SimpleDNSItem.ServeStale = ServeStale;
if (NormalDNSCompatible.IsNotEmpty()) if (NormalDNSCompatible.IsNotEmpty())
{ {

View file

@ -105,28 +105,14 @@
Text="{x:Static resx:ResUI.TbBootstrapDNSTips}" Text="{x:Static resx:ResUI.TbBootstrapDNSTips}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock
Grid.Row="4"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbXrayFreedomStrategy}" />
<ComboBox
x:Name="cmbRayFreedomDNSStrategy"
Grid.Row="4"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin4}"
PlaceholderText="Default" />
<TextBlock <TextBlock
Grid.Row="5" Grid.Row="5"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSBDirectResolveStrategy}" /> Text="{x:Static resx:ResUI.TbDirectResolveStrategy}" />
<ComboBox <ComboBox
x:Name="cmbSBDirectDNSStrategy" x:Name="cmbDirectDNSStrategy"
Grid.Row="5" Grid.Row="5"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
@ -138,27 +124,40 @@
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSBRemoteResolveStrategy}" /> Text="{x:Static resx:ResUI.TbRemoteResolveStrategy}" />
<ComboBox <ComboBox
x:Name="cmbSBRemoteDNSStrategy" x:Name="cmbRemoteDNSStrategy"
Grid.Row="6" Grid.Row="6"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
PlaceholderText="Default" /> PlaceholderText="Default" />
<TextBlock <TextBlock
Grid.Row="7" Grid.Row="7"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbAddCommonDNSHosts}" /> Text="{x:Static resx:ResUI.TbParallelQuery}" />
<ToggleSwitch <ToggleSwitch
x:Name="togAddCommonHosts" x:Name="togParallelQuery"
Grid.Row="7" Grid.Row="7"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock
Grid.Row="8"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbServeStale}" />
<ToggleSwitch
x:Name="togServeStale"
Grid.Row="8"
Grid.Column="1"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" />
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
@ -169,7 +168,7 @@
x:Name="gridAdvancedDNSSettings" x:Name="gridAdvancedDNSSettings"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
ColumnDefinitions="Auto,Auto,*" ColumnDefinitions="Auto,Auto,*"
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,*"> RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,*">
<TextBlock <TextBlock
x:Name="txtAdvancedDNSSettingsInvalid" x:Name="txtAdvancedDNSSettingsInvalid"
@ -197,15 +196,28 @@
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbFakeIP}" /> Text="{x:Static resx:ResUI.TbAddCommonDNSHosts}" />
<ToggleSwitch <ToggleSwitch
x:Name="togFakeIP" x:Name="togAddCommonHosts"
Grid.Row="2" Grid.Row="2"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock <TextBlock
Grid.Row="2" Grid.Row="3"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbFakeIP}" />
<ToggleSwitch
x:Name="togFakeIP"
Grid.Row="3"
Grid.Column="1"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" />
<TextBlock
Grid.Row="3"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -213,19 +225,19 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="3" Grid.Row="4"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbBlockSVCBHTTPSQueries}" /> Text="{x:Static resx:ResUI.TbBlockSVCBHTTPSQueries}" />
<ToggleSwitch <ToggleSwitch
x:Name="togBlockBindingQuery" x:Name="togBlockBindingQuery"
Grid.Row="3" Grid.Row="4"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock <TextBlock
Grid.Row="3" Grid.Row="4"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -233,20 +245,20 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="4" Grid.Row="5"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbValidateDirectExpectedIPs}" /> Text="{x:Static resx:ResUI.TbValidateDirectExpectedIPs}" />
<ComboBox <ComboBox
x:Name="cmbDirectExpectedIPs" x:Name="cmbDirectExpectedIPs"
Grid.Row="4" Grid.Row="5"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
IsEditable="True" /> IsEditable="True" />
<TextBlock <TextBlock
Grid.Row="4" Grid.Row="5"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -254,7 +266,7 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="5" Grid.Row="6"
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
@ -263,7 +275,7 @@
<TextBox <TextBox
x:Name="txtHosts" x:Name="txtHosts"
Grid.Row="6" Grid.Row="7"
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"

View file

@ -15,16 +15,15 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
btnCancel.Click += (s, e) => Close(); btnCancel.Click += (s, e) => Close();
ViewModel = new DNSSettingViewModel(UpdateViewHandler); ViewModel = new DNSSettingViewModel(UpdateViewHandler);
cmbRayFreedomDNSStrategy.ItemsSource = Global.DomainStrategy4Freedoms; cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
cmbSBDirectDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
cmbSBRemoteDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out;
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress; cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress; cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress; cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
cmbDirectExpectedIPs.ItemsSource = Global.ExpectedIPs; cmbDirectExpectedIPs.ItemsSource = Global.ExpectedIPs;
cmbdomainStrategy4FreedomCompatible.ItemsSource = Global.DomainStrategy4Freedoms; cmbdomainStrategy4FreedomCompatible.ItemsSource = Global.DomainStrategy;
cmbdomainStrategy4OutCompatible.ItemsSource = Global.SingboxDomainStrategy4Out; cmbdomainStrategy4OutCompatible.ItemsSource = Global.DomainStrategies4Sbox;
cmbdomainDNSAddressCompatible.ItemsSource = Global.DomainPureIPDNSAddress; cmbdomainDNSAddressCompatible.ItemsSource = Global.DomainPureIPDNSAddress;
cmbdomainDNSAddress2Compatible.ItemsSource = Global.DomainPureIPDNSAddress; cmbdomainDNSAddress2Compatible.ItemsSource = Global.DomainPureIPDNSAddress;
@ -37,11 +36,12 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
this.Bind(ViewModel, vm => vm.DirectDNS, v => v.cmbDirectDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DirectDNS, v => v.cmbDirectDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RemoteDNS, v => v.cmbRemoteDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.RemoteDNS, v => v.cmbRemoteDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RayStrategy4Freedom, v => v.cmbRayFreedomDNSStrategy.SelectedItem).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.SelectedItem).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SingboxStrategy4Direct, v => v.cmbSBDirectDNSStrategy.SelectedItem).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SingboxStrategy4Proxy, v => v.cmbSBRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.ServeStale, v => v.togServeStale.IsChecked).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);

View file

@ -26,7 +26,7 @@ public partial class RoutingRuleSettingWindow : WindowBase<RoutingRuleSettingVie
ViewModel = new RoutingRuleSettingViewModel(routingItem, UpdateViewHandler); ViewModel = new RoutingRuleSettingViewModel(routingItem, UpdateViewHandler);
cmbdomainStrategy.ItemsSource = Global.DomainStrategies.AppendEmpty(); cmbdomainStrategy.ItemsSource = Global.DomainStrategies.AppendEmpty();
cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Singbox; cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Sbox;
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {

View file

@ -22,7 +22,7 @@ public partial class RoutingSettingWindow : WindowBase<RoutingSettingViewModel>
ViewModel = new RoutingSettingViewModel(UpdateViewHandler); ViewModel = new RoutingSettingViewModel(UpdateViewHandler);
cmbdomainStrategy.ItemsSource = Global.DomainStrategies; cmbdomainStrategy.ItemsSource = Global.DomainStrategies;
cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Singbox; cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Sbox;
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {

View file

@ -133,31 +133,15 @@
Text="{x:Static resx:ResUI.TbBootstrapDNSTips}" Text="{x:Static resx:ResUI.TbBootstrapDNSTips}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock
Grid.Row="4"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbXrayFreedomStrategy}" />
<ComboBox
x:Name="cmbRayFreedomDNSStrategy"
Grid.Row="4"
Grid.Column="1"
Width="200"
Margin="{StaticResource Margin8}"
materialDesign:HintAssist.Hint="Default"
Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="5" Grid.Row="5"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSBDirectResolveStrategy}" /> Text="{x:Static resx:ResUI.TbDirectResolveStrategy}" />
<ComboBox <ComboBox
x:Name="cmbSBDirectDNSStrategy" x:Name="cmbDirectDNSStrategy"
Grid.Row="5" Grid.Row="5"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
@ -171,9 +155,9 @@
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSBRemoteResolveStrategy}" /> Text="{x:Static resx:ResUI.TbRemoteResolveStrategy}" />
<ComboBox <ComboBox
x:Name="cmbSBRemoteDNSStrategy" x:Name="cmbRemoteDNSStrategy"
Grid.Row="6" Grid.Row="6"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
@ -187,13 +171,27 @@
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbAddCommonDNSHosts}" /> Text="{x:Static resx:ResUI.TbParallelQuery}" />
<ToggleButton <ToggleButton
x:Name="togAddCommonHosts" x:Name="togParallelQuery"
Grid.Row="7" Grid.Row="7"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock
Grid.Row="8"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbServeStale}" />
<ToggleButton
x:Name="togServeStale"
Grid.Row="8"
Grid.Column="1"
Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" />
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
@ -207,6 +205,7 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@ -245,15 +244,29 @@
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}" Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbFakeIP}" /> Text="{x:Static resx:ResUI.TbAddCommonDNSHosts}" />
<ToggleButton <ToggleButton
x:Name="togFakeIP" x:Name="togAddCommonHosts"
Grid.Row="2" Grid.Row="2"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock <TextBlock
Grid.Row="2" Grid.Row="3"
Grid.Column="0"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbFakeIP}" />
<ToggleButton
x:Name="togFakeIP"
Grid.Row="3"
Grid.Column="1"
Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" />
<TextBlock
Grid.Row="3"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -262,7 +275,7 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="3" Grid.Row="4"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -270,12 +283,12 @@
Text="{x:Static resx:ResUI.TbBlockSVCBHTTPSQueries}" /> Text="{x:Static resx:ResUI.TbBlockSVCBHTTPSQueries}" />
<ToggleButton <ToggleButton
x:Name="togBlockBindingQuery" x:Name="togBlockBindingQuery"
Grid.Row="3" Grid.Row="4"
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock <TextBlock
Grid.Row="3" Grid.Row="4"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -284,7 +297,7 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="4" Grid.Row="5"
Grid.Column="0" Grid.Column="0"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -292,14 +305,14 @@
Text="{x:Static resx:ResUI.TbValidateDirectExpectedIPs}" /> Text="{x:Static resx:ResUI.TbValidateDirectExpectedIPs}" />
<ComboBox <ComboBox
x:Name="cmbDirectExpectedIPs" x:Name="cmbDirectExpectedIPs"
Grid.Row="4" Grid.Row="5"
Grid.Column="1" Grid.Column="1"
Width="200" Width="200"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
IsEditable="True" IsEditable="True"
Style="{StaticResource DefComboBox}" /> Style="{StaticResource DefComboBox}" />
<TextBlock <TextBlock
Grid.Row="4" Grid.Row="5"
Grid.Column="2" Grid.Column="2"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -308,7 +321,7 @@
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<TextBlock <TextBlock
Grid.Row="5" Grid.Row="6"
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
@ -317,7 +330,7 @@
Text="{x:Static resx:ResUI.TbDNSHostsConfig}" /> Text="{x:Static resx:ResUI.TbDNSHostsConfig}" />
<TextBox <TextBox
x:Name="txtHosts" x:Name="txtHosts"
Grid.Row="6" Grid.Row="7"
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"

View file

@ -13,16 +13,15 @@ public partial class DNSSettingWindow
ViewModel = new DNSSettingViewModel(UpdateViewHandler); ViewModel = new DNSSettingViewModel(UpdateViewHandler);
cmbRayFreedomDNSStrategy.ItemsSource = Global.DomainStrategy4Freedoms; cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
cmbSBDirectDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out; cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
cmbSBRemoteDNSStrategy.ItemsSource = Global.SingboxDomainStrategy4Out;
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress; cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress; cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress; cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
cmbDirectExpectedIPs.ItemsSource = Global.ExpectedIPs; cmbDirectExpectedIPs.ItemsSource = Global.ExpectedIPs;
cmbdomainStrategy4FreedomCompatible.ItemsSource = Global.DomainStrategy4Freedoms; cmbdomainStrategy4FreedomCompatible.ItemsSource = Global.DomainStrategy;
cmbdomainStrategy4OutCompatible.ItemsSource = Global.SingboxDomainStrategy4Out; cmbdomainStrategy4OutCompatible.ItemsSource = Global.DomainStrategies4Sbox;
cmbdomainDNSAddressCompatible.ItemsSource = Global.DomainPureIPDNSAddress; cmbdomainDNSAddressCompatible.ItemsSource = Global.DomainPureIPDNSAddress;
cmbdomainDNSAddress2Compatible.ItemsSource = Global.DomainPureIPDNSAddress; cmbdomainDNSAddress2Compatible.ItemsSource = Global.DomainPureIPDNSAddress;
@ -35,11 +34,12 @@ public partial class DNSSettingWindow
this.Bind(ViewModel, vm => vm.DirectDNS, v => v.cmbDirectDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DirectDNS, v => v.cmbDirectDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RemoteDNS, v => v.cmbRemoteDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.RemoteDNS, v => v.cmbRemoteDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.RayStrategy4Freedom, v => v.cmbRayFreedomDNSStrategy.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SingboxStrategy4Direct, v => v.cmbSBDirectDNSStrategy.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.SingboxStrategy4Proxy, v => v.cmbSBRemoteDNSStrategy.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
this.Bind(ViewModel, vm => vm.ServeStale, v => v.togServeStale.IsChecked).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);

View file

@ -18,7 +18,7 @@ public partial class RoutingRuleSettingWindow
ViewModel = new RoutingRuleSettingViewModel(routingItem, UpdateViewHandler); ViewModel = new RoutingRuleSettingViewModel(routingItem, UpdateViewHandler);
cmbdomainStrategy.ItemsSource = Global.DomainStrategies.AppendEmpty(); cmbdomainStrategy.ItemsSource = Global.DomainStrategies.AppendEmpty();
cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Singbox; cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Sbox;
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {

View file

@ -17,7 +17,7 @@ public partial class RoutingSettingWindow
ViewModel = new RoutingSettingViewModel(UpdateViewHandler); ViewModel = new RoutingSettingViewModel(UpdateViewHandler);
cmbdomainStrategy.ItemsSource = Global.DomainStrategies; cmbdomainStrategy.ItemsSource = Global.DomainStrategies;
cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Singbox; cmbdomainStrategy4Singbox.ItemsSource = Global.DomainStrategies4Sbox;
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {