【发布时间】:2011-04-15 04:38:50
【问题描述】:
如何判断默认文本框上下文菜单何时打开(打开之前)或关闭之后(不是之前,之后)?当我使用标准的内置菜单时,ContextMenuOpening 和 ContextMenuClosing 事件似乎没有触发。我猜我可以简单地重新创建菜单并使用标准命令填充它,但这似乎有点矫枉过正。
具体原因是,我有一个模板化控件,它在“编辑”模式下交换了一个文本框。当文本框失去焦点时,该控件会自动退出编辑模式。问题是当上下文菜单弹出时,文本框失去焦点,从而退出编辑模式,上下文菜单立即消失。
我想要做的是在上下文菜单打开之前,设置一个标志来短路文本框上的 LostFocus 事件代码。然后在上下文菜单关闭后,我需要清除该标志,但我还需要检测现在具有焦点的控件是否仍然是文本框,如果不是,则处理代码,就好像它确实失去了焦点。 (或者,如果我知道哪个控件在关闭后 将 获得焦点,我可以在事件关闭之前对其进行测试。它会达到相同的效果。)
如果有人显示上下文菜单(因此文本框在技术上不再具有焦点)但随后单击 UI 中的其他位置会关闭上下文菜单,则需要处理特定情况,因为我需要检测文本框实际上已经失去焦点,因此控件应该退出编辑模式。但是,如果用户通过在文本框中单击返回来关闭上下文菜单,那么我不希望触发 LostFocus 事件。
有意义吗?
M
更新:从技术上讲,这个问题没有得到回答,尽管我将其标记为这样,因为响应者确实帮助我解决了我的问题。但至于这里的实际问题,答案似乎是“你不能”。
好消息是因为默认的文本框上下文菜单只有三个标准项目,通过将其添加到某处的资源中很容易复制...
<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" />
...然后您的事件按您的预期工作。如果你问我仍然很奇怪,但无论如何都是一个微不足道的解决方法,所以我不会抱怨。
M
【问题讨论】:
-
谢谢!我目前遇到了同样的问题,这是一个有效的解决方案。