代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

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

  •  2
  • paxdiablo  · 技术社区  · 15 年前

    我在XAML窗体上有一个按钮,它调用 btnName_Click() 背面代码 cs 文件。

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

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

    我已经阅读了路由命令,但对于一些应该很简单的东西来说,这似乎是很多工作。

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jasper wontondon    14 年前

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

        2
  •  2
  •   BFree    15 年前

    在根窗口元素中,钩住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方法,以及更具体的命令和附加行为。这将使这个单元更易于测试。