【问题标题】:How do I run some simple C# code for a given keypress?如何为给定的按键运行一些简单的 C# 代码?
【发布时间】:2010-06-23 04:14:03
【问题描述】:

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

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

无论我当前在哪个控件中,这都需要工作(例如,有一个 TextBox,如果我在其中,我想确保它不会捕获事件)。

我已经阅读了路由命令,但对于应该简单的事情来说,这似乎需要做很多工作。

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

【问题讨论】:

    标签: c# xaml button keyboard-shortcuts


    【解决方案1】:

    在根 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 用于命令推荐。有时它可能很难卖,但它确实是这样做的正确方法。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,Nitin,它展示了如何直接调用按钮单击并让我控制击键以阻止它击中文本框。我不需要 StackPanel,我只是把它直接放在顶层 Window 上。但除了那个微小的变化,一切都很完美。
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多