Я пытаюсь обработать Ctrl + Down в виде дерева как пользовательский ярлык.Я пробовал следующий код:
<Window x:Class="WpfTreeIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:local="clr-namespace:WpfTreeIssue"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
x:Name="_this">
<Grid DataContext="{Binding ElementName=_this}">
<TreeView>
<TreeView.InputBindings>
<KeyBinding
Key="Down" Modifiers="Ctrl"
Command="{Binding ControlDownCommand}" />
<KeyBinding
Key="A"
Command="{Binding ControlDownCommand}" />
</TreeView.InputBindings>
<TreeViewItem Header="Level 1" IsExpanded="True">
<TreeViewItem Header="Level 2.1" />
<TreeViewItem Header="Level 2.2" IsExpanded="True">
<TreeViewItem Header="Level 3.1" />
<TreeViewItem Header="Level 3.2" />
</TreeViewItem>
<TreeViewItem Header="Level 2.3" />
</TreeViewItem>
</TreeView>
</Grid>
Codebehind:
public partial class MainWindow : Window
{
public ICommand ControlDownCommand
{
get
{
return new RelayCommand<KeyBinding>(x => OnControlDown(x));
}
}
private void OnControlDown(KeyBinding keyBinding)
{
Console.Write("HELLO");
}
public MainWindow()
{
InitializeComponent();
}
}
RelayCommand является базовой ReplayCommand, как показано здесь: https://www.c -sharpcorner.com/UploadFile/20c06b/icommand-and-relaycommand-in-wpf/
Я добавил привязки клавиш для обоих Ctrl-Down
& A
.Ярлык A
работает просто отлично, но Ctrl-Down не работает.
Я пытался удалить модификатор Ctrl, а ярлык down по-прежнему не работает (он перемещает выбранный элемент дерева, что имеет смысл).Интересно, что ярлык вниз работает, если вы переходите к последнему элементу в древовидной структуре и нажимаете вниз (Ctrl-down не работает в этом случае).
Любые предложения о том, как я могу получить Ctrl-DownKeyBinding для работы с моим TreeView?
Редактировать: я также попытался переопределить методы OnView Key и OnPreviewKeyDown TreeView безуспешно.См. Ниже:
public class CustomTreeView : TreeView
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Down)
{
Console.WriteLine("Down arrow");
if ((e.KeyboardDevice.IsKeyDown(Key.RightCtrl) || e.KeyboardDevice.IsKeyDown(Key.LeftCtrl)))
{
Console.WriteLine("TEST");
e.Handled = true;
}
}
base.OnKeyDown(e);
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Down)
{
Console.WriteLine("Down arrow");
if ((e.KeyboardDevice.IsKeyDown(Key.RightCtrl) || e.KeyboardDevice.IsKeyDown(Key.LeftCtrl)))
{
Console.WriteLine("TEST");
e.Handled = true;
}
}
base.OnPreviewKeyDown(e);
}
}
Если я удерживаю клавишу Ctrl и нажимаю на строку, Console.WriteLine("Down arrow");
никогда не получает удар (событие стрелки вниз не отправляется).Если я просто нажму, строка будет нажата, но модификатор ctrl не установлен.