Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何判断默认文本框上下文菜单何时打开或关闭?_Wpf_Events_Textbox - Fatal编程技术网

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

Wpf 如何判断默认文本框上下文菜单何时打开或关闭?,wpf,events,textbox,Wpf,Events,Textbox,如何判断默认文本框上下文菜单何时将要打开(打开之前)或关闭之后(而不是之前、之后)?当我使用标准的内置菜单时,ContextMenuOpening和ContextMenuClosing事件似乎不会触发。我猜我可以简单地重新创建菜单并用标准命令填充它,但这似乎有点过分了 具体的原因是,我有一个模板控件,在“编辑”模式下交换一个文本框。当文本框失去焦点时,该控件自动退出编辑模式。问题是当上下文菜单弹出时,文本框失去焦点,从而退出编辑模式,上下文菜单立即消失 我要做的是,在上下文菜单打开之前,在文本框

如何判断默认文本框上下文菜单何时将要打开(打开之前)或关闭之后(而不是之前、之后)?当我使用标准的内置菜单时,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" />

…那么您的事件将如您所期望的那样进行。如果你问我的话,这仍然很奇怪,但无论如何,这是一项琐碎的工作,所以我不会抱怨


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

默认情况下,
文本框
在默认上下文菜单打开时仍会为
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>

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

欢迎使用StackOverflow!期待更多的好答案。乔希,我倒着看时间戳。你12岁,他11岁,但我忘了“以前”那部分。我把答案给你了!请查看他的评论,了解我与此问题相关的其他一些问题。请注意:@H.B.哦,我不知道“签名中没有链接”规则。我已经把它从我的帖子中删除了。嗨,乔希·史密斯,很显然,你在WPF有一个很好的代表!我不知道你的情况,但正如他们所说,谷歌是我的朋友。所以在这和一个类似的问题之间,我已经根据我的答案找到了答案。但是虽然它确实有效,但对我来说它似乎是‘黑客’的!也就是说,你能解释一下吗?有更好的办法吗?在这里,我再次解释了为什么LostFocus和LostKeyboardFocus本身都不能满足我的需求,从而得到了冗长的解决方案。想法?啊!我用的是LostKeyboardFocus,不是LostFocus!该死,那很简单!英雄联盟投票通过并接受!顺便说一句,你赢了Josh一分钟,所以你得到了答案,但我投票支持你们两个。不过还有一个问题。。。如果只是默认的上下文菜单,那么上下文菜单事件不会触发,这是对的,还是我也遗漏了什么?我想他比我快了一分钟。你可以把答案转给他!更重要的是,我有一个样式,它使用isKeyboardFocusInside来设置自己的样式(文本框在里面),但是,当上下文菜单打开时,由于切换的是键盘焦点,因此样式也会改变。我的工作是创建第二种样式,使用控件上的IsEditing来处理这种情况,但这对我来说有点不雅。想法?如果IsKeyboardFocusInStyle是一件微妙的事情,那么在上下文菜单打开时改变样式也不错。如果它是不和谐的,那么你需要一些其他的状态,而你的iEdit似乎是适合这项工作的工具。谢谢!我目前也有同样的问题,这是一个有效的解决方案。
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("GotFocus");
    }

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