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

WPF:OnKeyDown()未为从WPF TextBox派生的控件中的空格键调用

  •  16
  • Ergwun  · 技术社区  · 16 年前

    public class SelectableTextBlock : TextBox
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            e.Handled = false;
        }
    }
    

    在文本框中输入空格或单击Backspace时,不会调用OnKeyDown方法,但会为其他输入(包括正常可打印字符(例如“a”)和修改键(例如)触发。

    我使用这个控件时,IsReadOnly设置为true,这样我就可以显示可选的、不可编辑的文本。WPFToolkit的DataGrid中使用的控件,我希望KeyDown事件向上传播到数据网格,即使SelectableTextBlock具有焦点,这就是为什么我使用自定义控件将事件显式标记为未处理。

    问题是,对于某些键,事件甚至没有进入我的控制范围。我不能仅仅在数据网格中使用OnPreviewKeyDown来解决这个问题,因为我确实希望数据网格中使用的其他控件能够吞下空格KeyDown事件。

    谢谢

    4 回复  |  直到 16 年前
        1
  •  23
  •   ivan    13 年前

    PreviewKeyDown事件正是针对这种情况而存在的。

    private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Space)
            e.Handled = true;
    }
    

    您的KeyDown处理程序将永远不会接收空格键的KeyDown事件。

        2
  •  14
  •   Ergwun    16 年前

    问题似乎是空格(和退格等)键按下事件已经在文本框中处理了,然后冒泡到我的派生控件。我假设作为文本合成过程的一部分,正如Wim发布的那样。

    真正地

    public class SelectableTextBlock : TextBox
    {
        public SelectableTextBlock() : base()
        {
            this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true);
        }
    
        public void HandleHandledKeyDown(object sender, RoutedEventArgs e)
        {
            KeyEventArgs ke = e as KeyEventArgs;
            if (ke.Key == Key.Space)
            {
                ke.Handled = false;
            }
        }
        ...
    }
    

    谢谢

        3
  •  3
  •   Mac    15 年前

    从文本框派生一个say,RestrictKeysTextBox。

    public class RestrictKeysTextBox : TextBox
    {
        ....
    }
    

    将此覆盖中的逻辑如下所示:

    if (e.Key == Key.Space)
    {
        e.Handled = true;
    }
    

    将RestrictKeysTextBox实例绑定到DataGrid。

    这应该可以在不覆盖DataGrid中的OnPreviewKeyDown的情况下工作,并消除相关问题。

        4
  •  2
  •   hypo    16 年前

    我曾经在文本框中遇到过空格和事件的问题。事件是否仅在添加或删除空格字符时触发?

    这就是我得到的答案:( http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b )

    因为一些IME会将空格击键视为文本合成过程的一部分,所以Avalon会通过TextInput事件报告正确的合成文本。

    亲切问候,, 懦夫

    推荐文章