正确的方法来阻止keydown事件冒泡

时间:2016-04-01 15:11:29

标签: c# wpf keydown

这里我有窗口需要处理keydown事件中的不同键。当按下Enter时弹出文本框出现,文本键入此文本框不应该引发窗口keydown事件。

<Window x:Class="PopupTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:PopupTest"
    mc:Ignorable="d"
    Title="MainWindow"
    Height="350"
    Width="525"
    KeyDown="Window_KeyDown"  >
<Grid>
    <Popup Name="symbolPopup"
           Grid.Row="0"
           Placement="RelativePoint"
           IsOpen="False">
        <TextBox Width="70" x:Name="symbolTextBox"
                 KeyDown="symbolTextBox_KeyDown"
                 Background="#FFFFDF18" />

    </Popup>
</Grid>

代码背后:

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.Key)
        {
            case Key.Enter:
                {
                    symbolPopup.IsOpen = true;
                    symbolTextBox.Focus();
                    break;
                }
            default:
                break;
        }
    }

    private void symbolTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            symbolPopup.IsOpen = false;
            string name = symbolTextBox.Text;
            symbolTextBox.Text = null;
            e.Handled = true;
            MessageBox.Show(name + " assigned");
        }
        // e.Handled = true;
    }

打开弹出窗口时,我不需要触发窗口keydown事件。如果我取消注释//e.Handled = true文本框根本不会得到任何文本。我知道我可以通过检查弹出窗口是否在窗口keydown处理程序的主体中打开来解决这个问题,但我的问题是如何阻止keydown从文本框中弹出来同时让文本框获取用户类型?

1 个答案:

答案 0 :(得分:0)

你无法阻止事件解雇你只需要更聪明地处理

例如 你考虑过将事件切换到预览事件吗? What are WPF Preview Events?

或者您无法根据弹出窗口的可见性

的值设置处理

所以 在窗口事件处理程序

std::vector

请记住,e.Handled = true会取消冒泡/隧道过程,所以只有当你确定没有其他人想要处理事件时才应该设置