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

Mar*_*eIV 7 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>
Run Code Online (Sandbox Code Playgroud)

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

<TextBox x:Name="EditTextBox"
    ContextMenu="{StaticResource DefaultTextBoxContextMenu}"
    ContextMenuOpening="EditTextBox_ContextMenuOpening"
    ContextMenuClosing="EditTextBox_ContextMenuClosing" />
Run Code Online (Sandbox Code Playgroud)

...然后你的活动就像你期望的那样.如果你问我,但仍然很奇怪,但无论如何我都不会抱怨.

中号

小智 6

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

  • 欢迎来到StackOverflow!期待更多精彩的答案. (2认同)