【问题标题】:could not capture down arrow in combobox in wpf无法在 wpf 的组合框中捕获向下箭头
【发布时间】:2010-08-17 12:59:53
【问题描述】:

我在 wpf 的窗口上有一个组合框,我正在尝试捕获此组合框的向下箭头键,但我无法这样做。以下是组合框的唯一代码。

<ComboBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120"
              PreviewKeyDown="comboBox1_PreviewKeyDown" KeyDown="comboBox1_KeyDown" IsEditable="True"/>

C#

private void comboBox1_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Down)
            MessageBox.Show("hi");
    }

    private void comboBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Down)
            MessageBox.Show("hi");
    }

当我按下向下箭头键时,甚至没有命中该事件。

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    尝试改为处理 PreviewKeyUp(或 KeyUp)。如果这不起作用,那么您的窗口或代码必须有更多内容(您是否正在处理这些事件的其他实例)?

    【讨论】:

    • 嗨 Wonko PreviewKeyUp 事件有效。但是你能解释一下PreviewKeyDown事件没有被向下箭头键触发吗???
    • 我对此并不肯定,但我认为这与 PreviewKeyDown 是一个隧道事件有关。通过使 ComboBox 可编辑,我相信成为 ComboBox 的 ControlTemplate 一部分的 TextBox 正在吞噬该事件。
    • 它是一个隧道事件这一事实是否意味着 samar 的 PreviewKeyDown 事件处理程序应该在 TextBox 有机会处理它之前触发?
    【解决方案2】:

    这段代码对我很有帮助。

    <StackPanel PreviewKeyDown="StackPanel_PreviewKeyDown">
        <ComboBox>
            <ComboBoxItem>item1</ComboBoxItem>
            <ComboBoxItem>item2</ComboBoxItem>
            <ComboBoxItem>item3</ComboBoxItem>
        </ComboBox>
    </StackPanel>
    

    代码隐藏

    private void StackPanel_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Down)
        {
    
        }
    }
    

    【讨论】:

    • 简单而强大的解决方案。我确认这是一个运行良好的解决方案和合适的答案。
    【解决方案3】:

    通过从基 ComboBox 继承来创建一个新的 Combo box 类。下面的代码解释了如何。当您将组合框添加到另一个控件(如数据网格单元格)时,您可能会遇到此类问题。希望这会有所帮助!

    http://csharpquestsolution.blogspot.com/2013/11/arrow-key-events-not-getting-fired-on.html

    public class MyComboBox : ComboBox
    {
        protected override bool ProcessKeyMessage(ref Message m)
        {
            KeyEventArgs keyArgs = new KeyEventArgs((Keys)m.WParam);
            switch(keyArgs.KeyCode)
            {
                case Keys.Up :
                    //Implement your code here.
                    return true;
                case Keys.Down :
                    //Implement your code here.
                    return true;
            }
            return base.ProcessKeyMessage(ref m);
        }
    }
    

    【讨论】:

    • 我很确定这是 WinForms,而不是 WPF。
    • @OlaBerntsson 是的,它适用于 WinForms,此解决方案适用于特定场景,最新版本可能不需要它。认为它可能对 WPF 也有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多