Compare commits

...

3 commits

Author SHA1 Message Date
2dust
a452bbe140 Fix
Some checks are pending
release Linux / build (Release) (push) Waiting to run
release macOS / build (Release) (push) Waiting to run
release Windows desktop (Avalonia UI) / build (Release) (push) Waiting to run
release Windows / build (Release) (push) Waiting to run
https://github.com/2dust/v2rayN/issues/8061
2025-10-04 19:54:15 +08:00
DHR60
185c5e4bfb
Fix (#8057) 2025-10-04 16:17:39 +08:00
2dust
bbe64aa970 Remove AutoCompleteBox
https://github.com/2dust/v2rayN/pull/8067
2025-10-04 16:16:32 +08:00
21 changed files with 93 additions and 186 deletions

View file

@ -155,61 +155,60 @@ public class BaseFmt
protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item) protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item)
{ {
item.Flow = query["flow"] ?? ""; item.Flow = GetQueryValue(query, "flow");
item.StreamSecurity = query["security"] ?? ""; item.StreamSecurity = GetQueryValue(query, "security");
item.Sni = query["sni"] ?? ""; item.Sni = GetQueryValue(query, "sni");
item.Alpn = Utils.UrlDecode(query["alpn"] ?? ""); item.Alpn = GetQueryDecoded(query, "alpn");
item.Fingerprint = Utils.UrlDecode(query["fp"] ?? ""); item.Fingerprint = GetQueryDecoded(query, "fp");
item.PublicKey = Utils.UrlDecode(query["pbk"] ?? ""); item.PublicKey = GetQueryDecoded(query, "pbk");
item.ShortId = Utils.UrlDecode(query["sid"] ?? ""); item.ShortId = GetQueryDecoded(query, "sid");
item.SpiderX = Utils.UrlDecode(query["spx"] ?? ""); item.SpiderX = GetQueryDecoded(query, "spx");
item.Mldsa65Verify = Utils.UrlDecode(query["pqv"] ?? ""); item.Mldsa65Verify = GetQueryDecoded(query, "pqv");
item.AllowInsecure = (query["allowInsecure"] ?? "") == "1" ? "true" : ""; item.AllowInsecure = new[] { "allowInsecure", "allow_insecure", "insecure" }.Any(k => (query[k] ?? "") == "1") ? "true" : "";
item.Network = query["type"] ?? nameof(ETransport.tcp); item.Network = GetQueryValue(query, "type", nameof(ETransport.tcp));
switch (item.Network) switch (item.Network)
{ {
case nameof(ETransport.tcp): case nameof(ETransport.tcp):
item.HeaderType = query["headerType"] ?? Global.None; item.HeaderType = GetQueryValue(query, "headerType", Global.None);
item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); item.RequestHost = GetQueryDecoded(query, "host");
break; break;
case nameof(ETransport.kcp): case nameof(ETransport.kcp):
item.HeaderType = query["headerType"] ?? Global.None; item.HeaderType = GetQueryValue(query, "headerType", Global.None);
item.Path = Utils.UrlDecode(query["seed"] ?? ""); item.Path = GetQueryDecoded(query, "seed");
break; break;
case nameof(ETransport.ws): case nameof(ETransport.ws):
case nameof(ETransport.httpupgrade): case nameof(ETransport.httpupgrade):
item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); item.RequestHost = GetQueryDecoded(query, "host");
item.Path = Utils.UrlDecode(query["path"] ?? "/"); item.Path = GetQueryDecoded(query, "path", "/");
break; break;
case nameof(ETransport.xhttp): case nameof(ETransport.xhttp):
item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); item.RequestHost = GetQueryDecoded(query, "host");
item.Path = Utils.UrlDecode(query["path"] ?? "/"); item.Path = GetQueryDecoded(query, "path", "/");
item.HeaderType = Utils.UrlDecode(query["mode"] ?? ""); item.HeaderType = GetQueryDecoded(query, "mode");
item.Extra = Utils.UrlDecode(query["extra"] ?? ""); item.Extra = GetQueryDecoded(query, "extra");
break; break;
case nameof(ETransport.http): case nameof(ETransport.http):
case nameof(ETransport.h2): case nameof(ETransport.h2):
item.Network = nameof(ETransport.h2); item.Network = nameof(ETransport.h2);
item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); item.RequestHost = GetQueryDecoded(query, "host");
item.Path = Utils.UrlDecode(query["path"] ?? "/"); item.Path = GetQueryDecoded(query, "path", "/");
break; break;
case nameof(ETransport.quic): case nameof(ETransport.quic):
item.HeaderType = query["headerType"] ?? Global.None; item.HeaderType = GetQueryValue(query, "headerType", Global.None);
item.RequestHost = query["quicSecurity"] ?? Global.None; item.RequestHost = GetQueryValue(query, "quicSecurity", Global.None);
item.Path = Utils.UrlDecode(query["key"] ?? ""); item.Path = GetQueryDecoded(query, "key");
break; break;
case nameof(ETransport.grpc): case nameof(ETransport.grpc):
item.RequestHost = Utils.UrlDecode(query["authority"] ?? ""); item.RequestHost = GetQueryDecoded(query, "authority");
item.Path = Utils.UrlDecode(query["serviceName"] ?? ""); item.Path = GetQueryDecoded(query, "serviceName");
item.HeaderType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode); item.HeaderType = GetQueryDecoded(query, "mode", Global.GrpcGunMode);
break; break;
default: default:
@ -239,4 +238,14 @@ public class BaseFmt
var url = $"{Utils.UrlEncode(userInfo)}@{GetIpv6(address)}:{port}"; var url = $"{Utils.UrlEncode(userInfo)}@{GetIpv6(address)}:{port}";
return $"{Global.ProtocolShares[eConfigType]}{url}{query}{remark}"; return $"{Global.ProtocolShares[eConfigType]}{url}{query}{remark}";
} }
protected static string GetQueryValue(NameValueCollection query, string key, string defaultValue = "")
{
return query[key] ?? defaultValue;
}
protected static string GetQueryDecoded(NameValueCollection query, string key, string defaultValue = "")
{
return Utils.UrlDecode(GetQueryValue(query, key, defaultValue));
}
} }

View file

@ -21,10 +21,10 @@ public class Hysteria2Fmt : BaseFmt
var query = Utils.ParseQueryString(url.Query); var query = Utils.ParseQueryString(url.Query);
ResolveStdTransport(query, ref item); ResolveStdTransport(query, ref item);
item.Path = Utils.UrlDecode(query["obfs-password"] ?? ""); item.Path = GetQueryDecoded(query, "obfs-password");
item.AllowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; item.AllowInsecure = GetQueryValue(query, "insecure") == "1" ? "true" : "false";
item.Ports = Utils.UrlDecode(query["mport"] ?? ""); item.Ports = GetQueryDecoded(query, "mport");
return item; return item;
} }

View file

@ -30,7 +30,7 @@ public class TuicFmt : BaseFmt
var query = Utils.ParseQueryString(url.Query); var query = Utils.ParseQueryString(url.Query);
ResolveStdTransport(query, ref item); ResolveStdTransport(query, ref item);
item.HeaderType = query["congestion_control"] ?? ""; item.HeaderType = GetQueryValue(query, "congestion_control");
return item; return item;
} }

View file

@ -24,8 +24,8 @@ public class VLESSFmt : BaseFmt
item.Id = Utils.UrlDecode(url.UserInfo); item.Id = Utils.UrlDecode(url.UserInfo);
var query = Utils.ParseQueryString(url.Query); var query = Utils.ParseQueryString(url.Query);
item.Security = query["encryption"] ?? Global.None; item.Security = GetQueryValue(query, "encryption", Global.None);
item.StreamSecurity = query["security"] ?? ""; item.StreamSecurity = GetQueryValue(query, "security");
_ = ResolveStdTransport(query, ref item); _ = ResolveStdTransport(query, ref item);
return item; return item;

View file

@ -24,10 +24,10 @@ public class WireguardFmt : BaseFmt
var query = Utils.ParseQueryString(url.Query); var query = Utils.ParseQueryString(url.Query);
item.PublicKey = Utils.UrlDecode(query["publickey"] ?? ""); item.PublicKey = GetQueryDecoded(query, "publickey");
item.Path = Utils.UrlDecode(query["reserved"] ?? ""); item.Path = GetQueryDecoded(query, "reserved");
item.RequestHost = Utils.UrlDecode(query["address"] ?? ""); item.RequestHost = GetQueryDecoded(query, "address");
item.ShortId = Utils.UrlDecode(query["mtu"] ?? ""); item.ShortId = GetQueryDecoded(query, "mtu");
return item; return item;
} }

View file

@ -2932,16 +2932,7 @@ namespace ServiceLib.Resx {
} }
/// <summary> /// <summary>
/// 查找类似 The sing-box DoH resolution server can be overwritten 的本地化字符串。 /// 查找类似 Resolve DNS server domains, requires IP 的本地化字符串。
/// </summary>
public static string TbSBDoHOverride {
get {
return ResourceManager.GetString("TbSBDoHOverride", resourceCulture);
}
}
/// <summary>
/// 查找类似 Fallback DNS Resolution, Require IP 的本地化字符串。
/// </summary> /// </summary>
public static string TbSBFallbackDNSResolve { public static string TbSBFallbackDNSResolve {
get { get {

View file

@ -1429,7 +1429,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>Fallback DNS Resolution, Require IP</value> <value>Resolve DNS server domains, requires IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>xray Freedom Resolution Strategy</value>
@ -1443,9 +1443,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>The sing-box DoH resolution server can be overwritten</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -1429,7 +1429,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>Fallback DNS Resolution, Require IP</value> <value>Resolve DNS server domains, requires IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>xray Freedom Resolution Strategy</value>
@ -1443,9 +1443,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>The sing-box DoH resolution server can be overwritten</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -1429,7 +1429,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>Fallback DNS Resolution, Require IP</value> <value>Resolve DNS server domains, requires IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>xray Freedom Resolution Strategy</value>
@ -1443,9 +1443,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>The sing-box DoH resolution server can be overwritten</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -1429,7 +1429,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>Fallback DNS Resolution, Require IP</value> <value>Resolve DNS server domains, requires IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>Стратегия резолвинга Freedom (Xray)</value> <value>Стратегия резолвинга Freedom (Xray)</value>
@ -1443,9 +1443,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Добавить стандартные записи hosts (DNS)</value> <value>Добавить стандартные записи hosts (DNS)</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>Сервер DoH-резолвера sing-box можно переопределить</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -1426,7 +1426,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>回退 DNS 解析,需指定为 IP</value> <value>解析 DNS 服务器域名,需指定为 IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>xray freedom 解析策略</value> <value>xray freedom 解析策略</value>
@ -1440,9 +1440,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>添加常用 DNS Hosts</value> <value>添加常用 DNS Hosts</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>开启后可覆盖 sing-box DoH 解析服务器</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -1426,7 +1426,7 @@
<value>Bootstrap DNS (sing-box)</value> <value>Bootstrap DNS (sing-box)</value>
</data> </data>
<data name="TbSBFallbackDNSResolve" xml:space="preserve"> <data name="TbSBFallbackDNSResolve" xml:space="preserve">
<value>Fallback DNS Resolution, Require IP</value> <value>Resolve DNS server domains, requires IP</value>
</data> </data>
<data name="TbXrayFreedomResolveStrategy" xml:space="preserve"> <data name="TbXrayFreedomResolveStrategy" xml:space="preserve">
<value>xray Freedom Resolution Strategy</value> <value>xray Freedom Resolution Strategy</value>
@ -1440,9 +1440,6 @@
<data name="TbAddCommonDNSHosts" xml:space="preserve"> <data name="TbAddCommonDNSHosts" xml:space="preserve">
<value>Add Common DNS Hosts</value> <value>Add Common DNS Hosts</value>
</data> </data>
<data name="TbSBDoHOverride" xml:space="preserve">
<value>The sing-box DoH resolution server can be overwritten</value>
</data>
<data name="TbFakeIP" xml:space="preserve"> <data name="TbFakeIP" xml:space="preserve">
<value>FakeIP</value> <value>FakeIP</value>
</data> </data>

View file

@ -186,7 +186,7 @@ public partial class CoreConfigV2rayService(Config config)
ret.Success = true; ret.Success = true;
ret.Data = await ApplyFullConfigTemplate(v2rayConfig, true); ret.Data = await ApplyFullConfigTemplate(v2rayConfig);
return ret; return ret;
} }
catch (Exception ex) catch (Exception ex)

View file

@ -4,7 +4,7 @@ namespace ServiceLib.Services.CoreConfig;
public partial class CoreConfigV2rayService public partial class CoreConfigV2rayService
{ {
private async Task<string> ApplyFullConfigTemplate(V2rayConfig v2rayConfig, bool handleBalancerAndRules = false) private async Task<string> ApplyFullConfigTemplate(V2rayConfig v2rayConfig)
{ {
var fullConfigTemplate = await AppManager.Instance.GetFullConfigTemplateItem(ECoreType.Xray); var fullConfigTemplate = await AppManager.Instance.GetFullConfigTemplateItem(ECoreType.Xray);
if (fullConfigTemplate == null || !fullConfigTemplate.Enabled || fullConfigTemplate.Config.IsNullOrEmpty()) if (fullConfigTemplate == null || !fullConfigTemplate.Enabled || fullConfigTemplate.Config.IsNullOrEmpty())
@ -19,7 +19,7 @@ public partial class CoreConfigV2rayService
} }
// Handle balancer and rules modifications (for multiple load scenarios) // Handle balancer and rules modifications (for multiple load scenarios)
if (handleBalancerAndRules && v2rayConfig.routing?.balancers?.Count > 0) if (v2rayConfig.routing?.balancers?.Count > 0)
{ {
var balancer = v2rayConfig.routing.balancers.First(); var balancer = v2rayConfig.routing.balancers.First();
@ -60,6 +60,34 @@ public partial class CoreConfigV2rayService
} }
} }
if (v2rayConfig.observatory != null)
{
if (fullConfigTemplateNode["observatory"] == null)
{
fullConfigTemplateNode["observatory"] = JsonNode.Parse(JsonUtils.Serialize(v2rayConfig.observatory));
}
else
{
var subjectSelector = v2rayConfig.observatory.subjectSelector;
subjectSelector.AddRange(fullConfigTemplateNode["observatory"]?["subjectSelector"]?.AsArray()?.Select(x => x?.GetValue<string>()) ?? []);
fullConfigTemplateNode["observatory"]["subjectSelector"] = JsonNode.Parse(JsonUtils.Serialize(subjectSelector.Distinct().ToList()));
}
}
if (v2rayConfig.burstObservatory != null)
{
if (fullConfigTemplateNode["burstObservatory"] == null)
{
fullConfigTemplateNode["burstObservatory"] = JsonNode.Parse(JsonUtils.Serialize(v2rayConfig.burstObservatory));
}
else
{
var subjectSelector = v2rayConfig.burstObservatory.subjectSelector;
subjectSelector.AddRange(fullConfigTemplateNode["burstObservatory"]?["subjectSelector"]?.AsArray()?.Select(x => x?.GetValue<string>()) ?? []);
fullConfigTemplateNode["burstObservatory"]["subjectSelector"] = JsonNode.Parse(JsonUtils.Serialize(subjectSelector.Distinct().ToList()));
}
}
// Handle outbounds - append instead of override // Handle outbounds - append instead of override
var customOutboundsNode = fullConfigTemplateNode["outbounds"] is JsonArray outbounds ? outbounds : new JsonArray(); var customOutboundsNode = fullConfigTemplateNode["outbounds"] is JsonArray outbounds ? outbounds : new JsonArray();
foreach (var outbound in v2rayConfig.outbounds) foreach (var outbound in v2rayConfig.outbounds)

View file

@ -20,7 +20,6 @@
<ResourceDictionary> <ResourceDictionary>
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="Assets/GlobalResources.axaml" /> <ResourceInclude Source="Assets/GlobalResources.axaml" />
<ResourceInclude Source="Controls/AutoCompleteBox.axaml" />
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>

View file

@ -1,48 +0,0 @@
<ResourceDictionary
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:v2rayN.Desktop.Controls">
<!-- Add Resources Here -->
<ControlTheme x:Key="{x:Type controls:AutoCompleteBox}" TargetType="controls:AutoCompleteBox">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="MinHeight" Value="{DynamicResource AutoCompleteBoxDefaultHeight}" />
<Setter Property="MaxDropDownHeight" Value="{DynamicResource AutoCompleteMaxDropdownHeight}" />
<Setter Property="Template">
<ControlTemplate TargetType="AutoCompleteBox">
<Panel>
<TextBox
Name="PART_TextBox"
MinHeight="{TemplateBinding MinHeight}"
VerticalAlignment="Stretch"
DataValidationErrors.Errors="{TemplateBinding (DataValidationErrors.Errors)}"
InnerLeftContent="{TemplateBinding InnerLeftContent}"
InnerRightContent="{TemplateBinding InnerRightContent}"
Watermark="{TemplateBinding Watermark}" />
<Popup
Name="PART_Popup"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
IsLightDismissEnabled="True"
PlacementTarget="{TemplateBinding}">
<Border
MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
Margin="{DynamicResource AutoCompleteBoxPopupMargin}"
Padding="{DynamicResource AutoCompleteBoxPopupPadding}"
HorizontalAlignment="Stretch"
Background="{DynamicResource AutoCompleteBoxPopupBackground}"
BorderBrush="{DynamicResource AutoCompleteBoxPopupBorderBrush}"
BorderThickness="{DynamicResource AutoCompleteBoxPopupBorderThickness}"
BoxShadow="{DynamicResource AutoCompleteBoxPopupBoxShadow}"
CornerRadius="{DynamicResource AutoCompleteBoxPopupCornerRadius}">
<ListBox
Name="PART_SelectingItemsControl"
Foreground="{TemplateBinding Foreground}"
ItemTemplate="{TemplateBinding ItemTemplate}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
</Border>
</Popup>
</Panel>
</ControlTemplate>
</Setter>
</ControlTheme>
</ResourceDictionary>

View file

@ -1,40 +0,0 @@
using Avalonia.Input;
using Avalonia.Interactivity;
namespace v2rayN.Desktop.Controls;
public class AutoCompleteBox : Avalonia.Controls.AutoCompleteBox
{
static AutoCompleteBox()
{
MinimumPrefixLengthProperty.OverrideDefaultValue<AutoCompleteBox>(0);
}
public AutoCompleteBox()
{
AddHandler(PointerPressedEvent, OnBoxPointerPressed, RoutingStrategies.Tunnel);
}
private void OnBoxPointerPressed(object? sender, PointerPressedEventArgs e)
{
if (Equals(sender, this) && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
{
SetCurrentValue(IsDropDownOpenProperty, true);
}
}
protected override void OnGotFocus(GotFocusEventArgs e)
{
base.OnGotFocus(e);
if (IsDropDownOpen)
{
return;
}
SetCurrentValue(IsDropDownOpenProperty, true);
}
public void Clear()
{
SetCurrentValue(SelectedItemProperty, null);
}
}

View file

@ -2,7 +2,6 @@
x:Class="v2rayN.Desktop.Views.DNSSettingWindow" x:Class="v2rayN.Desktop.Views.DNSSettingWindow"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrls="clr-namespace:v2rayN.Desktop.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
@ -174,13 +173,6 @@
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin4}" Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock
Grid.Row="8"
Grid.Column="2"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbSBDoHOverride}"
TextWrapping="Wrap" />
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>

View file

@ -2,7 +2,6 @@
x:Class="v2rayN.Desktop.Views.OptionSettingWindow" x:Class="v2rayN.Desktop.Views.OptionSettingWindow"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrls="clr-namespace:v2rayN.Desktop.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
@ -622,7 +621,8 @@
Grid.Row="23" Grid.Row="23"
Grid.Column="1" Grid.Column="1"
Width="300" Width="300"
Margin="{StaticResource Margin4}" /> Margin="{StaticResource Margin4}"
IsEditable="True" />
<TextBlock <TextBlock
Grid.Row="23" Grid.Row="23"
Grid.Column="2" Grid.Column="2"
@ -642,7 +642,8 @@
Grid.Row="24" Grid.Row="24"
Grid.Column="1" Grid.Column="1"
Width="300" Width="300"
Margin="{StaticResource Margin4}" /> Margin="{StaticResource Margin4}"
IsEditable="True" />
<TextBlock <TextBlock
Grid.Row="24" Grid.Row="24"
Grid.Column="2" Grid.Column="2"
@ -662,7 +663,8 @@
Grid.Row="25" Grid.Row="25"
Grid.Column="1" Grid.Column="1"
Width="300" Width="300"
Margin="{StaticResource Margin4}" /> Margin="{StaticResource Margin4}"
IsEditable="True" />
<TextBlock <TextBlock
Grid.Row="25" Grid.Row="25"
Grid.Column="2" Grid.Column="2"

View file

@ -2,7 +2,6 @@
x:Class="v2rayN.Desktop.Views.RoutingRuleDetailsWindow" x:Class="v2rayN.Desktop.Views.RoutingRuleDetailsWindow"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrls="clr-namespace:v2rayN.Desktop.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"

View file

@ -210,13 +210,6 @@
Grid.Column="1" Grid.Column="1"
Margin="{StaticResource Margin8}" Margin="{StaticResource Margin8}"
HorizontalAlignment="Left" /> HorizontalAlignment="Left" />
<TextBlock
Grid.Row="8"
Grid.Column="3"
Margin="{StaticResource Margin8}"
VerticalAlignment="Center"
Style="{StaticResource ToolbarTextBlock}"
Text="{x:Static resx:ResUI.TbSBDoHOverride}" />
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>