#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 от кражи фокуса.