MessageBox не фокусируется

Когда я нажимаю кнопку ввода, отображается MessageBox. Я хочу, чтобы MessageBox закрывался, когда я снова нажимаю кнопку ввода, как обычно. Проблема в том, что у него нет фокуса, а у TextBox есть, и когда я нажимаю кнопку ввода, обработчик событий _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");
}

person monstr    schedule 06.04.2016    source источник
comment
покажите это, я думаю, то же самое и с вашим случаем: enter-key-on-it" title="команда wpf для текстового поля, которое запускается, когда мы нажимаем на нем клавишу ввода"> stackoverflow.com/questions/6882196/   -  person Mouaici_Med    schedule 06.04.2016
comment
Это одна из печально известных проблем с воздушным пространством, активацию и фокус необходимо эмулировать в WPF, поскольку элементы управления не являются окнами. Это может быть довольно глючным, если вы не сделаете это обычным способом, WPF имеет жесткое предположение, что сочетания клавиш реализуются с уведомлением KeyDown. Вместо этого использование этого события тривиально решает вашу проблему.   -  person Hans Passant    schedule 06.04.2016


Ответы (2)


Вы можете использовать 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");
}
person Salah Akbari    schedule 06.04.2016
comment
Спасибо, похоже, это работает, но что мне делать, если я ДОЛЖЕН использовать событие KeyUp? - person monstr; 06.04.2016

Я рекомендую использовать этот метод 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");
}
person Jean-Charbel VANNIER    schedule 06.04.2016
comment
Нет, это все еще не закрывает MessageBox, снова нажимая кнопку ввода, как хотел OP. - person Salah Akbari; 06.04.2016
comment
Согласен с Акбаем и в реальном приложении (не в этом тесте) у меня Application.Current.MainWindow = null - person monstr; 06.04.2016
comment
Я внес изменения, если ваш Application.Current.MainWindow имеет значение null, тогда вы должны заменить мой комментарий чем-то, что дает вам текущее окно - person Jean-Charbel VANNIER; 06.04.2016