首页 文章

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

提问于
浏览
1

在这里,我有窗口需要处理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

    你不能阻止事件发生你只需要更聪明地处理

    例如,您是否考虑过将事件切换到预览事件? What are WPF Preview Events?

    或者您无法根据弹出窗口的可见性值设置处理

    所以在窗口事件处理程序中

    if(popup.Visibility == Visibility.Visible)
    {
        //ignore event
    }
    else
    {
       //handle window processing
       e.Handled = true;
    }
    

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

相关问题