MessageBox不会获取焦点

3
当我点击“Enter”按钮时,会弹出一个“MessageBox”对话框。我希望像平常一样再次点击“Enter”按钮时,“MessageBox”对话框能够关闭。问题是-它没有焦点,而“TextBox”有焦点。当我点击“Enter”按钮时,“_textBox_OnKeyUp”事件处理程序会被反复调用。我该如何解决这个问题?
标记:
<Grid>
    <TextBox Name="_textBox"
        Width="100"
        Height="30"
        Background="OrangeRed"
        KeyUp="_textBox_OnKeyUp"/>
</Grid>

代码:

private void _textBox_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.Key != Key.Enter)
        return;

    MessageBox.Show("Bla-bla");
}

展示这段代码,我认为它与你的情况相同:https://dev59.com/Omw15IYBdhLWcg3wA3GT - Mouaici_Med
这是臭名昭著的空域问题之一,激活和焦点需要在WPF中进行模拟,因为控件不是窗口。如果你不按照“正常”的方式去做,那么可能会出现很多故障。WPF有一个硬编码的假设,即快捷键采用KeyDown通知来实现。使用该事件可以轻松解决您的问题。 - Hans Passant
2个回答

3
您可以使用KeyDown事件,因为MessageBox响应KeyDown事件。请参阅此处了解更多信息。
<TextBox Name="_textBox"
         Width="100"
         Height="30"
         Background="OrangeRed"
         KeyDown="_textBox_OnKeyDown"/>

并且:

private void _textBox_OnKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key != Key.Enter)
       return;

    MessageBox.Show("Bla-bla");
}

谢谢,它似乎有效,但如果我必须使用KeyUp事件,我该怎么办? - monstr

1

我建议使用这种方法的Messagebox。

MessageBox.Show(Window, String)

来自MSDN:

在指定的窗口前显示一个消息框。该消息框显示一条消息并返回结果。

你可以按照以下方式使用它:

MessageBox.Show(Application.Current.MainWindow, "I'm on top of teh window so I should get focus");

编辑:

在调用MessageBox之前,您应将焦点返回到主窗口。

private void _textBox_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.Key != Key.Enter)
        return;

    //this.Focus() or at least YourWindow.Focus()
    MessageBox.Show("Bla-bla");
}

不,这并不能像 OP 想要的那样通过再次点击回车按钮来关闭“MessageBox”。 - Salah Akbari
同意Akbai的观点,在实际应用中(而不是在这个测试中),我将Application.Current.MainWindow设置为null。 - monstr
我进行了编辑,如果你的Application.Current.MainWindow为空,则应该将我的注释替换为一些可以提供当前窗口的内容。 - Jean-Charbel VANNIER
我只是使用了“this”,因为我已经在需要置于顶部的窗体中。 MessageBox.Show(this, ....) - iYazee6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接