如何判断默认文本框上下文菜单何时打开或关闭?

时间:2011-04-15 04:38:50

标签: wpf events textbox

如何判断默认文本框上下文菜单何时打开(打开之前)或关闭之后(之前,之后)?当我使用标准的内置菜单时,ContextMenuOpening和ContextMenuClosing事件似乎没有触发。我猜我可以简单地重新创建菜单并用标准命令填充它,但这似乎有点矫枉过正。

具体的原因是,我有一个模板化控件,在“编辑”模式下交换文本框。当文本框失去焦点时,该控件将自动退出编辑模式。问题是当弹出上下文菜单时,文本框失去焦点,因此它退出编辑模式,上下文菜单立即消失。

我想要做的就是在上下文菜单打开之前,设置一个标志以在文本框上短路LostFocus事件代码。然后上下文菜单关闭后,我需要清除该标志,但我还需要检测现在具有焦点的控件是否仍然是文本框,如果没有,则处理代码,就好像它一样确实失去了焦点。 (或者我可以在它关闭之前测试一个事件,如果我知道哪个控件在关闭时具有焦点。它将达到相同的效果。)

如果有人显示上下文菜单(并且因此文本框在技术上不再具有焦点),则需要处理特定情况,但随后在UI中的其他地方点击以解除上下文菜单,因为我需要检测实际上文本框已经失去焦点,因此控件应该退出编辑模式。但是如果用户通过单击文本框中的后退来关闭上下文菜单,那么我不希望触发LostFocus事件。

有意义吗?

中号


更新:从技术上讲,这个问题没有得到解答,虽然我标记了这个问题,因为响应者帮助我解决了我的问题。但至于这里的实际问题,看起来答案是“你不能”。

好消息是,由于默认文本框上下文菜单只有三个标准项,因此可以通过将其添加到某处的资源来轻松复制...

<ContextMenu x:Key="DefaultTextBoxContextMenu">
    <MenuItem Command="ApplicationCommands.Cut" />
    <MenuItem Command="ApplicationCommands.Copy" />
    <MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>

...并像这样附上......

<TextBox x:Name="EditTextBox"
    ContextMenu="{StaticResource DefaultTextBoxContextMenu}"
    ContextMenuOpening="EditTextBox_ContextMenuOpening"
    ContextMenuClosing="EditTextBox_ContextMenuClosing" />

...然后您的活动按预期工作。如果你问我,但仍然很奇怪,但无论如何我都不会抱怨。

中号

2 个答案:

答案 0 :(得分:6)

当文本框的上下文菜单打开时,文本框失去键盘焦点,但保留逻辑焦点。换句话说,它的LostKeyboardFocus事件将触发,但其LostFocus事件不会触发。当上下文菜单打开时,文本框的IsFocused属性仍然为true。根据您对问题的描述,您应该能够依靠逻辑焦点来确定何时结束控件中的“编辑模式”。

答案 1 :(得分:1)

默认情况下,TextBox仍然为IsFocused报告为true,而默认上下文菜单已打开,但IsKeyboardFocused报告为false。也就是说,当打开上下文菜单时,LostFocus上不会引发TextBox,但如果通过选择其他控件关闭上下文菜单,则会引发<Grid> <StackPanel> <TextBox Text="Some text one" GotFocus="TextBox_GotFocus" LostFocus="TextBox_LostFocus"/> <TextBox Text="Some text two"/> </StackPanel> </Grid> 。这听起来就像你正在寻找的行为。

您可以使用小型测试程序显示此默认行为:

    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("GotFocus");
    }

    private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("LostFocus");
    }

和代码隐藏:

{{1}}

如果您没有在较大的应用程序的上下文中获得此默认行为,则可能存在干扰焦点范围问题。