Как мне запустить простой код C # для данного нажатия клавиш? - PullRequest
2 голосов
/ 23 июня 2010

У меня есть кнопка в форме XAML, которая вызывает код btnName_Click() в файле поддержки cs.

Я также хочу назначить сочетание клавиш для запуска того же кода. В основном CTRL + & larr; или что-то подобное.

Это должно работать независимо от того, в каком элементе управления я сейчас нахожусь (например, есть TextBox, который, я хочу убедиться, не захватывает событие, если я там).

Я прочитал о маршрутизируемых командах, но это кажется большой работой для чего-то, что должно быть простым.

Есть ли простой способ сделать это или мне нужно создавать перенаправленные команды? Если мне нужно их использовать, какой самый простой способ добиться того, чего я хочу?

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

В корневом элементе Window подключается к событию KeyDown:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Keyboard.KeyDown="Window_KeyDown"
        >

Код:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        this.DoSomething();
    }

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Right && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
        {
            this.DoSomething();
        }
    }

    private void DoSomething()
    {
        MessageBox.Show("Whatever");
    }

В дополнение к этому, я бы предложил рассмотреть подход M-V-VM, а именно, Команды и Прикрепленное поведение. Это сделало бы этот объект более тестируемым.

1 голос
/ 23 июня 2010

Ваш XAML будет иметь вид:

<StackPanel PreviewKeyDown="StackPanel_PreviewKeyDown">
    <Button x:Name="btnName" Click="btnName_Click" Height="Auto" Width="Auto" Content="Name"></Button>
    <TextBox x:Name="tb"></TextBox>
</StackPanel>

, а ваш CS:

public MainWindow()
{
    InitializeComponent();
}

private void btnName_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("This is from btnName");
}

private void StackPanel_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Left)
    {
        btnName_Click(sender, new RoutedEventArgs());
        e.Handled = true;
    }
}

. Вы должны поместить событие PreviewKeydown в самый верхний элемент управления, например, окно, чтобы один раз Ctrl + ударил только по окну или верхнему элементу управления, и никто другой.

PreviewKeyDown - это туннельное событие - оно начинается с самого верхнего элемента управления иопускается до фактического контроля.

...