WPF TreeView KeyBinding Ctrl + Вниз - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь обработать 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 не установлен.

1 Ответ

0 голосов
/ 11 мая 2018

В элементе управления TreeView имеется код, который обрабатывает Ctrl + Down, поэтому привязка не работает, поскольку событие keys уже обработано. Вам нужно переопределить OnKeyDown на TreeView, чтобы сделать что-то свое.

Обновление : Вот проверенный образец

protected override void OnKeyDown(KeyEventArgs e)
        {
            if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                if (System.Windows.Input.Key.Down == e.Key)
                {
                    System.Diagnostics.Trace.WriteLine("Ctlr+Down");
                    e.Handled = true;
                }
            }

            if (!e.Handled)
            {
                base.OnKeyDown(e);
            }
        }
...