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

#c# #wpf

#.net #wpf #многопоточность #фокус

Вопрос:

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

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

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

Комментарии:

1. Есть ли способ открыть новое окно без фокусировки?

Ответ №1:

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

Комментарии:

1. Форма WPF? Что это?

Ответ №2:

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

Комментарии:

1. Не в этом случае. Пользователь должен иметь возможность взаимодействовать с формой

Ответ №3:

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

Поэтому я просто делаю это:

 private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.Topmost = true;
    this.Topmost = false;
}
 

Комментарии:

1. Поскольку загруженное событие срабатывает после того, как окно уже активировано и показано, это не останавливает if от кражи фокуса.