Как предотвратить кражу фокуса новой формой WPF?

Я написал простую программу в стиле MSN, которая будет отправлять и получать сообщения с помощью WCF. Основная форма содержит текстовое поле для ввода отправляемого сообщения. В фоновом режиме приложение каждые несколько секунд опрашивает сервер на наличие новых сообщений. При получении нового сообщения открывается новое окно для его отображения. Это должно быть сделано в потоке пользовательского интерфейса с использованием класса Dispatcher.

Проблема в том, что при отображении нового окна фокус смещается с TextBox, и ввод текста прерывается. Это очень раздражает! В MSN Messenger можно продолжать вводить собственное сообщение, получая его. Как это делается?

В качестве обходного пути я откладываю всплывающее окно с новым сообщением, пока TextBox находится в фокусе, но должен быть способ лучше!


person Dabblernl    schedule 21.09.2009    source источник
comment
Есть ли способ открыть новое окно без фокуса?   -  person matt b    schedule 22.09.2009


Ответы (3)


Ответ прост: начиная с .NET 3.5 SP1 формы WPF имеют свойство ShowActivated. Установите значение false, и любая помеченная таким образом форма больше не будет красть фокус!

person Dabblernl    schedule 22.09.2009
comment
Форма WPF? Что это? - person Scott Solmer; 09.07.2014

Вы можете установить для свойства Focusable окна значение false.

person codymanix    schedule 22.09.2009
comment
Не в этом дело. Пользователь должен иметь возможность взаимодействовать с формой - person Dabblernl; 22.09.2009

В моем приложении мне нужно отображать окно уведомлений поверх всех других окон, пока мое MainWindow свернуто, но без кражи фокуса.

Так что я просто делаю это:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.Topmost = true;
    this.Topmost = false;
}
person mandarin    schedule 23.09.2015
comment
Поскольку загруженное событие срабатывает после того, как окно уже активировано и отображается, это не останавливается, если происходит кража фокуса. - person Wobbles; 03.03.2017