Files
v2rayN/v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml
2dust 2ebd2b28a8 Support Backspace for remove actions in UI lists
Changed key handling and menu input gestures to allow Backspace (in addition to Delete) for removing items in server, profile, and routing rule lists. This improves usability and consistency across both Avalonia and WPF views.
2025-11-18 16:54:42 +08:00

258 lines
11 KiB
XML

<Window
x:Class="v2rayN.Desktop.Views.RoutingRuleSettingWindow"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
Title="{x:Static resx:ResUI.menuRoutingRuleSetting}"
Width="900"
Height="600"
x:DataType="vms:RoutingRuleSettingViewModel"
ShowInTaskbar="False"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<DockPanel>
<Menu Margin="{StaticResource Margin4}" DockPanel.Dock="Top">
<MenuItem x:Name="menuRuleAdd" Header="{x:Static resx:ResUI.menuRuleAdd}" />
<MenuItem x:Name="menuImportRulesFromFile" Header="{x:Static resx:ResUI.menuImportRulesFromFile}" />
<MenuItem x:Name="menuImportRulesFromClipboard" Header="{x:Static resx:ResUI.menuImportRulesFromClipboard}" />
<MenuItem x:Name="menuImportRulesFromUrl" Header="{x:Static resx:ResUI.menuImportRulesFromUrl}" />
</Menu>
<StackPanel
Margin="{StaticResource Margin4}"
HorizontalAlignment="Right"
DockPanel.Dock="Bottom"
Orientation="Horizontal">
<Button
x:Name="btnSave"
Width="100"
Content="{x:Static resx:ResUI.TbConfirm}"
IsDefault="True" />
<Button
x:Name="btnCancel"
Width="100"
Margin="{StaticResource MarginLr8}"
Content="{x:Static resx:ResUI.TbCancel}"
IsCancel="True" />
</StackPanel>
<Grid
Margin="{StaticResource Margin4}"
ColumnDefinitions="Auto,Auto,Auto"
DockPanel.Dock="Top"
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto">
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.LvRemarks}" />
<StackPanel
Grid.Row="0"
Grid.Column="1"
Orientation="Horizontal">
<TextBox
x:Name="txtRemarks"
Grid.Row="0"
Grid.Column="1"
Width="300"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextWrapping="Wrap" />
<TextBlock
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.LvSort}" />
<TextBox
x:Name="txtSort"
Width="100"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left" />
</StackPanel>
<TextBlock
Grid.Row="1"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbdomainStrategy}" />
<StackPanel
Grid.Row="1"
Grid.Column="1"
Orientation="Horizontal">
<ComboBox
x:Name="cmbdomainStrategy"
Width="200"
Margin="{StaticResource Margin4}" />
<TextBlock
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.TbdomainStrategy4Singbox}" />
<ComboBox
x:Name="cmbdomainStrategy4Singbox"
Width="200"
Margin="{StaticResource Margin4}" />
</StackPanel>
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center"
Text="{x:Static resx:ResUI.LvUrl}" />
<TextBox
x:Name="txtUrl"
Grid.Row="2"
Grid.Column="1"
Width="600"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextWrapping="Wrap" />
<!--
<TextBlock
Grid.Row="3"
Grid.Column="0"
VerticalAlignment="Center"
Margin="{StaticResource Margin4}"
Text="{x:Static resx:ResUI.LvCustomIcon}" />
<TextBox
x:Name="txtCustomIcon"
Grid.Row="3"
Grid.Column="1"
Width="600"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="{StaticResource Margin4}"
TextWrapping="Wrap" />
<Button
x:Name="btnBrowseCustomIcon"
Grid.Row="3"
Grid.Column="2"
Margin="{StaticResource Margin4}"
Content="{x:Static resx:ResUI.TbBrowse}" />
-->
<TextBlock
Grid.Row="4"
Grid.Column="0"
Margin="{StaticResource Margin4}"
VerticalAlignment="Center">
<HyperlinkButton Classes="WithIcon" Click="linkCustomRulesetPath4Singbox">
<TextBlock Text="{x:Static resx:ResUI.LvCustomRulesetPath4Singbox}" />
</HyperlinkButton>
</TextBlock>
<TextBox
x:Name="txtCustomRulesetPath4Singbox"
Grid.Row="4"
Grid.Column="1"
Width="600"
Margin="{StaticResource Margin4}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextWrapping="Wrap" />
<Button
x:Name="btnBrowseCustomRulesetPath4Singbox"
Grid.Row="4"
Grid.Column="2"
Margin="{StaticResource Margin4}"
Content="{x:Static resx:ResUI.TbBrowse}" />
</Grid>
<TabControl x:Name="tabAdvanced">
<TabItem HorizontalAlignment="Left" Header="{x:Static resx:ResUI.menuRuleList}">
<DataGrid
x:Name="lstRules"
AutoGenerateColumns="False"
Background="Transparent"
BorderThickness="1"
CanUserResizeColumns="True"
GridLinesVisibility="All"
HeadersVisibility="Column"
IsReadOnly="True"
ItemsSource="{Binding RulesItems}">
<DataGrid.KeyBindings>
<KeyBinding Command="{Binding RuleExportSelectedCmd}" Gesture="Ctrl+C" />
</DataGrid.KeyBindings>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem x:Name="menuRuleAdd2" Header="{x:Static resx:ResUI.menuRuleAdd}" />
<MenuItem
x:Name="menuRuleRemove"
Header="{x:Static resx:ResUI.menuRuleRemove}"
InputGesture="Back" />
<MenuItem
x:Name="menuRuleSelectAll"
Header="{x:Static resx:ResUI.menuSelectAll}"
InputGesture="Ctrl+A" />
<MenuItem x:Name="menuRuleExportSelected" Header="{x:Static resx:ResUI.menuRuleExportSelected}" />
<Separator />
<MenuItem
x:Name="menuMoveTop"
Header="{x:Static resx:ResUI.menuMoveTop}"
InputGesture="T" />
<MenuItem
x:Name="menuMoveUp"
Header="{x:Static resx:ResUI.menuMoveUp}"
InputGesture="U" />
<MenuItem
x:Name="menuMoveDown"
Header="{x:Static resx:ResUI.menuMoveDown}"
InputGesture="D" />
<MenuItem
x:Name="menuMoveBottom"
Header="{x:Static resx:ResUI.menuMoveBottom}"
InputGesture="B" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridCheckBoxColumn
Width="60"
Binding="{Binding Enabled}"
Header="" />
<DataGridTextColumn
Width="150"
Binding="{Binding Remarks}"
Header="{x:Static resx:ResUI.LvRemarks}" />
<DataGridTextColumn
Width="100"
Binding="{Binding RuleTypeName}"
Header="{x:Static resx:ResUI.TbRuleType}" />
<DataGridTextColumn
Width="130"
Binding="{Binding OutboundTag}"
Header="outboundTag" />
<DataGridTextColumn
Width="100"
Binding="{Binding Port}"
Header="port" />
<DataGridTextColumn
Width="100"
Binding="{Binding Protocols}"
Header="protocol" />
<DataGridTextColumn
Width="120"
Binding="{Binding InboundTags}"
Header="inboundTag" />
<DataGridTextColumn
Width="100"
Binding="{Binding Network}"
Header="network" />
<DataGridTextColumn
Width="*"
Binding="{Binding Domains}"
Header="domain / ip" />
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</DockPanel>
</Window>