如何为给定的按键运行一些简单的C#代码?

时间:2010-06-23 04:14:04

标签: c# xaml button keyboard-shortcuts

我在XAML表单上有一个按钮,用于调用支持btnName_Click()文件中的cs代码。

我还想指定一个键盘快捷键来运行相同的代码。基本上 CTRL + 或类似的东西。

无论我目前处于何种控制状态,这都需要工作(例如,如果我在那里,我希望确保不会捕获事件的TextBox。)

我已经阅读了路由命令,但这似乎很简单。

有一种简单的方法可以做到这一点还是我需要创建路由命令?如果我确实需要使用它们,那么实现我想要的最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

在根窗口元素钩子中进入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 :(得分:1)

将您的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是一个隧道事件 - 它起源于最顶层的控制并转向实际控制。