当复选框具有焦点时处理PreviewTextInput /在主窗口中处理PreviewTextInput并且不允许子控件窃取字符

时间:2009-09-29 22:41:04

标签: .net wpf textinput keydown

我有以下代码。该窗口有一个文本框和一个复选框。如果我专注于复选框以外的任何内容并输入类似123-456的内容,那么每个字符PreviewKeyDownPreviewTextInput都会被触发。

但是,如果我将焦点放在复选框上,然后键入123-456,则会为所有字符触发PreviewKeyDown,而PreviewTextInput仅针对123456触发,而不针对触发 - 。连字符由复选框处理,不会传递给PreviewTextInput。有没有办法将连字符设为PreviewTextInput

public Window1()
{
    InitializeComponent();
    TextCompositionManager.AddTextInputHandler(this, new TextCompositionEventHandler(Window_PreviewTextInput));
}

private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{

}

private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
}

1 个答案:

答案 0 :(得分:1)

我找到了一种方法可以做到这一点但我希望专家知道我的解决方案是否存在问题或更好的方法。

在窗口的KeyDown事件中,我将Handled标记为false。复选框在KeyDown中将Handled设置为true,并在Window的KeyDown中将其设置为false,这将调用PreviewTextInput,因为仍然需要处理事件。

public Window1()
        {
            InitializeComponent();
            TextCompositionManager.AddPreviewTextInputStartHandler(this, new TextCompositionEventHandler(Window_PreviewTextInput));
            this.AddHandler(Window.KeyDownEvent, new System.Windows.Input.KeyEventHandler(Window_KeyDown), true);
        }

private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
        }

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            e.Handled = false;
        }