mirror of
https://github.com/2dust/v2rayN.git
synced 2025-09-17 23:43:05 +00:00
Add global fakeip and fakeip filter (#7919)
Some checks failed
Some checks failed
This commit is contained in:
parent
33d9c5db6c
commit
4e042295d2
15 changed files with 163 additions and 30 deletions
|
@ -40,6 +40,7 @@ public class Global
|
||||||
public const string ProxySetLinuxShellFileName = NamespaceSample + "proxy_set_linux_sh";
|
public const string ProxySetLinuxShellFileName = NamespaceSample + "proxy_set_linux_sh";
|
||||||
public const string KillAsSudoOSXShellFileName = NamespaceSample + "kill_as_sudo_osx_sh";
|
public const string KillAsSudoOSXShellFileName = NamespaceSample + "kill_as_sudo_osx_sh";
|
||||||
public const string KillAsSudoLinuxShellFileName = NamespaceSample + "kill_as_sudo_linux_sh";
|
public const string KillAsSudoLinuxShellFileName = NamespaceSample + "kill_as_sudo_linux_sh";
|
||||||
|
public const string SingboxFakeIPFilterFileName = NamespaceSample + "singbox_fakeip_filter";
|
||||||
|
|
||||||
public const string DefaultSecurity = "auto";
|
public const string DefaultSecurity = "auto";
|
||||||
public const string DefaultNetwork = "tcp";
|
public const string DefaultNetwork = "tcp";
|
||||||
|
|
|
@ -113,6 +113,10 @@ public static class ConfigHandler
|
||||||
config.ConstItem ??= new ConstItem();
|
config.ConstItem ??= new ConstItem();
|
||||||
|
|
||||||
config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
|
config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
|
||||||
|
if (config.SimpleDNSItem.GlobalFakeIp is null)
|
||||||
|
{
|
||||||
|
config.SimpleDNSItem.GlobalFakeIp = true;
|
||||||
|
}
|
||||||
|
|
||||||
config.SpeedTestItem ??= new();
|
config.SpeedTestItem ??= new();
|
||||||
if (config.SpeedTestItem.SpeedTestTimeout < 10)
|
if (config.SpeedTestItem.SpeedTestTimeout < 10)
|
||||||
|
@ -2221,6 +2225,7 @@ public static class ConfigHandler
|
||||||
UseSystemHosts = false,
|
UseSystemHosts = false,
|
||||||
AddCommonHosts = true,
|
AddCommonHosts = true,
|
||||||
FakeIP = false,
|
FakeIP = false,
|
||||||
|
GlobalFakeIp = true,
|
||||||
BlockBindingQuery = true,
|
BlockBindingQuery = true,
|
||||||
DirectDNS = Global.DomainDirectDNSAddress.FirstOrDefault(),
|
DirectDNS = Global.DomainDirectDNSAddress.FirstOrDefault(),
|
||||||
RemoteDNS = Global.DomainRemoteDNSAddress.FirstOrDefault(),
|
RemoteDNS = Global.DomainRemoteDNSAddress.FirstOrDefault(),
|
||||||
|
|
|
@ -260,6 +260,7 @@ public class SimpleDNSItem
|
||||||
public bool? UseSystemHosts { get; set; }
|
public bool? UseSystemHosts { get; set; }
|
||||||
public bool? AddCommonHosts { get; set; }
|
public bool? AddCommonHosts { get; set; }
|
||||||
public bool? FakeIP { get; set; }
|
public bool? FakeIP { get; set; }
|
||||||
|
public bool? GlobalFakeIp { get; set; }
|
||||||
public bool? BlockBindingQuery { get; set; }
|
public bool? BlockBindingQuery { get; set; }
|
||||||
public string? DirectDNS { get; set; }
|
public string? DirectDNS { get; set; }
|
||||||
public string? RemoteDNS { get; set; }
|
public string? RemoteDNS { get; set; }
|
||||||
|
|
18
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
18
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
@ -2301,15 +2301,6 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查找类似 Apply to Proxy Domains Only 的本地化字符串。
|
|
||||||
/// </summary>
|
|
||||||
public static string TbApplyProxyDomainsOnly {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("TbApplyProxyDomainsOnly", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Auto refresh 的本地化字符串。
|
/// 查找类似 Auto refresh 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -2526,6 +2517,15 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Applies globally by default, with built-in FakeIP filtering (sing-box only). 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbFakeIPTips {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbFakeIPTips", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Fingerprint 的本地化字符串。
|
/// 查找类似 Fingerprint 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1455,9 +1455,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1515,4 +1512,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1455,9 +1455,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1515,4 +1512,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1455,9 +1455,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1515,4 +1512,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1455,9 +1455,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS hosts: (каждая строка в формате "domain1 ip1 ip2")</value>
|
<value>DNS hosts: (каждая строка в формате "domain1 ip1 ip2")</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Применять только к доменам через прокси</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Базовые настройки DNS</value>
|
<value>Базовые настройки DNS</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1515,4 +1512,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1452,9 +1452,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts:(“域名1 ip1 ip2” 一行一个)</value>
|
<value>DNS Hosts:(“域名1 ip1 ip2” 一行一个)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>仅对代理域名生效</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>DNS 基础设置</value>
|
<value>DNS 基础设置</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1512,4 +1509,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>选择配置文件</value>
|
<value>选择配置文件</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>默认全局生效,内置 FakeIP 过滤,仅在 sing-box 中生效</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1452,9 +1452,6 @@
|
||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -1512,4 +1509,7 @@
|
||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
92
v2rayN/ServiceLib/Sample/singbox_fakeip_filter
Normal file
92
v2rayN/ServiceLib/Sample/singbox_fakeip_filter
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"amobile.music.tc.qq.com",
|
||||||
|
"api-jooxtt.sanook.com",
|
||||||
|
"api.joox.com",
|
||||||
|
"aqqmusic.tc.qq.com",
|
||||||
|
"dl.stream.qqmusic.qq.com",
|
||||||
|
"ff.dorado.sdo.com",
|
||||||
|
"heartbeat.belkin.com",
|
||||||
|
"isure.stream.qqmusic.qq.com",
|
||||||
|
"joox.com",
|
||||||
|
"lens.l.google.com",
|
||||||
|
"localhost.ptlogin2.qq.com",
|
||||||
|
"localhost.sec.qq.com",
|
||||||
|
"mesu.apple.com",
|
||||||
|
"mobileoc.music.tc.qq.com",
|
||||||
|
"music.taihe.com",
|
||||||
|
"musicapi.taihe.com",
|
||||||
|
"na.b.g-tun.com",
|
||||||
|
"proxy.golang.org",
|
||||||
|
"ps.res.netease.com",
|
||||||
|
"shark007.net",
|
||||||
|
"songsearch.kugou.com",
|
||||||
|
"static.adtidy.org",
|
||||||
|
"streamoc.music.tc.qq.com",
|
||||||
|
"swcdn.apple.com",
|
||||||
|
"swdist.apple.com",
|
||||||
|
"swdownload.apple.com",
|
||||||
|
"swquery.apple.com",
|
||||||
|
"swscan.apple.com",
|
||||||
|
"trackercdn.kugou.com",
|
||||||
|
"xnotify.xboxlive.com"
|
||||||
|
],
|
||||||
|
"domain_keyword": [
|
||||||
|
"ntp",
|
||||||
|
"stun",
|
||||||
|
"time"
|
||||||
|
],
|
||||||
|
"domain_regex": [
|
||||||
|
"^[^.]+$",
|
||||||
|
"^[^.]+\\.[^.]+\\.xboxlive\\.com$",
|
||||||
|
"^localhost\\.[^.]+\\.weixin\\.qq\\.com$",
|
||||||
|
"^mijia\\scloud$",
|
||||||
|
"^xbox\\.[^.]+\\.microsoft\\.com$",
|
||||||
|
"^xbox\\.[^.]+\\.[^.]+\\.microsoft\\.com$"
|
||||||
|
],
|
||||||
|
"domain_suffix": [
|
||||||
|
"126.net",
|
||||||
|
"3gppnetwork.org",
|
||||||
|
"battle.net",
|
||||||
|
"battlenet.com.cn",
|
||||||
|
"cdn.nintendo.net",
|
||||||
|
"cmbchina.com",
|
||||||
|
"cmbimg.com",
|
||||||
|
"ff14.sdo.com",
|
||||||
|
"ffxiv.com",
|
||||||
|
"finalfantasyxiv.com",
|
||||||
|
"gcloudcs.com",
|
||||||
|
"home.arpa",
|
||||||
|
"invalid",
|
||||||
|
"kuwo.cn",
|
||||||
|
"lan",
|
||||||
|
"linksys.com",
|
||||||
|
"linksyssmartwifi.com",
|
||||||
|
"local",
|
||||||
|
"localdomain",
|
||||||
|
"localhost",
|
||||||
|
"market.xiaomi.com",
|
||||||
|
"mcdn.bilivideo.cn",
|
||||||
|
"media.dssott.com",
|
||||||
|
"msftconnecttest.com",
|
||||||
|
"msftncsi.com",
|
||||||
|
"music.163.com",
|
||||||
|
"music.migu.cn",
|
||||||
|
"n0808.com",
|
||||||
|
"nflxvideo.net",
|
||||||
|
"oray.com",
|
||||||
|
"orayimg.com",
|
||||||
|
"router.asus.com",
|
||||||
|
"sandai.net",
|
||||||
|
"square-enix.com",
|
||||||
|
"srv.nintendo.net",
|
||||||
|
"steamcontent.com",
|
||||||
|
"uu.163.com",
|
||||||
|
"wargaming.net",
|
||||||
|
"wggames.cn",
|
||||||
|
"wotgame.cn",
|
||||||
|
"wowsgame.cn",
|
||||||
|
"xiami.com",
|
||||||
|
"y.qq.com"
|
||||||
|
]
|
||||||
|
}
|
|
@ -44,6 +44,7 @@
|
||||||
<EmbeddedResource Include="Sample\tun_singbox_inbound" />
|
<EmbeddedResource Include="Sample\tun_singbox_inbound" />
|
||||||
<EmbeddedResource Include="Sample\tun_singbox_rules" />
|
<EmbeddedResource Include="Sample\tun_singbox_rules" />
|
||||||
<EmbeddedResource Include="Sample\linux_autostart_config" />
|
<EmbeddedResource Include="Sample\linux_autostart_config" />
|
||||||
|
<EmbeddedResource Include="Sample\singbox_fakeip_filter" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -33,6 +33,15 @@ public partial class CoreConfigSingboxService
|
||||||
lastRule.Ip?.Contains("0.0.0.0/0") == true);
|
lastRule.Ip?.Contains("0.0.0.0/0") == true);
|
||||||
}
|
}
|
||||||
singboxConfig.dns.final = useDirectDns ? Global.SingboxDirectDNSTag : Global.SingboxRemoteDNSTag;
|
singboxConfig.dns.final = useDirectDns ? Global.SingboxDirectDNSTag : Global.SingboxRemoteDNSTag;
|
||||||
|
if ((!useDirectDns) && simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == false)
|
||||||
|
{
|
||||||
|
singboxConfig.dns.rules.Add(new()
|
||||||
|
{
|
||||||
|
server = Global.SingboxFakeDNSTag,
|
||||||
|
query_type = new List<int> { 1, 28 }, // A and AAAA
|
||||||
|
rewrite_ttl = 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Tun2SocksAddress
|
// Tun2SocksAddress
|
||||||
if (node != null && Utils.IsDomain(node.Address))
|
if (node != null && Utils.IsDomain(node.Address))
|
||||||
|
@ -187,6 +196,28 @@ public partial class CoreConfigSingboxService
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == true)
|
||||||
|
{
|
||||||
|
var fakeipFilterRule = JsonUtils.Deserialize<Rule4Sbox>(EmbedUtils.GetEmbedText(Global.SingboxFakeIPFilterFileName));
|
||||||
|
fakeipFilterRule.invert = true;
|
||||||
|
var rule4Fake = new Rule4Sbox
|
||||||
|
{
|
||||||
|
server = Global.SingboxFakeDNSTag,
|
||||||
|
type = "logical",
|
||||||
|
mode = "and",
|
||||||
|
rewrite_ttl = 1,
|
||||||
|
rules = new List<Rule4Sbox>
|
||||||
|
{
|
||||||
|
new() {
|
||||||
|
query_type = new List<int> { 1, 28 }, // A and AAAA
|
||||||
|
},
|
||||||
|
fakeipFilterRule,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
singboxConfig.dns.rules.Add(rule4Fake);
|
||||||
|
}
|
||||||
|
|
||||||
var routing = await ConfigHandler.GetDefaultRouting(_config);
|
var routing = await ConfigHandler.GetDefaultRouting(_config);
|
||||||
if (routing == null)
|
if (routing == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -266,10 +297,12 @@ public partial class CoreConfigSingboxService
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (simpleDNSItem.FakeIP == true)
|
if (simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == false)
|
||||||
{
|
{
|
||||||
var rule4Fake = JsonUtils.DeepCopy(rule);
|
var rule4Fake = JsonUtils.DeepCopy(rule);
|
||||||
rule4Fake.server = Global.SingboxFakeDNSTag;
|
rule4Fake.server = Global.SingboxFakeDNSTag;
|
||||||
|
rule4Fake.query_type = new List<int> { 1, 28 }; // A and AAAA
|
||||||
|
rule4Fake.rewrite_ttl = 1;
|
||||||
singboxConfig.dns.rules.Add(rule4Fake);
|
singboxConfig.dns.rules.Add(rule4Fake);
|
||||||
}
|
}
|
||||||
rule.server = Global.SingboxRemoteDNSTag;
|
rule.server = Global.SingboxRemoteDNSTag;
|
||||||
|
|
|
@ -229,7 +229,7 @@
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbApplyProxyDomainsOnly}"
|
Text="{x:Static resx:ResUI.TbFakeIPTips}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|
|
@ -281,7 +281,7 @@
|
||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbApplyProxyDomainsOnly}"
|
Text="{x:Static resx:ResUI.TbFakeIPTips}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|
Loading…
Reference in a new issue