Как я могу установить фокусное управление после диалогового окна? - PullRequest
2 голосов
/ 10 октября 2011

Я работаю над приложением XBAP, где пользователи в основном используют клавиатуру для навигации. Когда я отображаю MessageBox, я могу нажать Enter, чтобы закрыть его, но тогда основное приложение, похоже, не восстанавливает фокус. Я должен вручную щелкнуть мышью на экране, чтобы вернуть фокус на приложение.

Есть ли способ обойти это?

Редактировать

Я могу убедиться, что приложение все еще имеет логический фокус, но оно просто не имеет фокус клавиатуры

Ответы [ 3 ]

0 голосов
/ 10 октября 2011

Я нашел хак, который работает, хотя он мне не нравится, потому что я чувствую, что он связывает мои представления с моей моделью ViewModel

Я использую IsFocused AttachedProperty , чтобы привязать элемент управления к логическому свойству за представлением. Это же представление также подписывается на событие DisplayError, которое отображает ошибку MessageBox и впоследствии сбрасывает свойство IsFocused, обновляя пользовательский интерфейс. Последнее изменение состояло в том, чтобы обновить мои ViewModels для публикации ошибок на EventAggregator вместо того, чтобы обрабатывать себя с MessageBox, что в любом случае, вероятно, лучше.

Полагаю, это работает, даже если мне это не нравится

0 голосов
/ 20 декабря 2013

Не уверен, поможет ли это вашей ситуации, но в моих обстоятельствах я мог вернуться к главному окну, что можно было сделать с помощью

App.Current.MainWindow.Focus();

Просто убедитесь, что главное окно правильно инициализировано, что может быть не так, если заставка, или какое-либо окно входа в систему, или что-то изначально захватило роль главного окна (т. Е. StartupUri), а затем больше ничего не обновлялось.

Это сработало для меня, так как я обрабатывал все события клавиатуры на уровне главного окна для обновления моей модели представления.

0 голосов
/ 10 октября 2011
using System.Runtime.InteropServices;
using System.Windows.Interop;

public class Interop
{
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

public static IntPtr GetWindowHandle(Window window)
{
     return new WindowInteropHelper(window).Handle;
}
}

// In main window, when the MessageBox is closed
IntPtr window = Interop.GetWindowHandle(this);
IntPtr focused = Interop.GetForegroundWindow();
if (window != focused)
{ 
    Interop.SetForegroundWindow(window);
}

http://tech.avivo.si/2009/11/how-to-focus-window-in-wpf-when-it-gets-out-of-focus/

...