Descripción del problemaWPF aplicación pierde por completo el foco en la ventana estrecha
Si hago una ventana no modal como una ventana secundaria a través de establecer que el dueño de la ventana para una ventana padre, y luego mostrar un cuadro de mensaje desde dentro esta ventana secundaria, la ventana principal perderá foco si cierro la ventana secundaria. Si Windows Explorer u otra aplicación está abierta, esta aplicación obtendrá el foco y mi ventana principal estará oculta.
Esto parece ser un problema conocido, ya que lo vi en otro newsgroups, pero no he visto una buena solución. Establecer al propietario como nulo en OnDeactivate no es una opción. Configurar el propietario antes de mostrar MessageBox para anular y restablecer después de eso no ayuda. Establecer que el propietario anule en el evento OnClosed tampoco ayuda.
solución simple que se encuentra
Si experimenta el mismo problema que he descrito, coloque el código siguiente en el OnClosing de todas las ventanas secundarias.
void OnClosing(System.ComponentModel.CancelEventArgs e)
base.OnClosing(e);
if (null != Owner) {
Owner.Activate();
}
// ....
Se puede seguir con cualquier otra lógica de procesamiento, incluso se tolera la apertura de MessageBoxes.
Ejemplo de código
La cuestión parece ser mucho más grande como pensaba. El siguiente ejemplo eliminará el foco de la ventana principal si se abrirá el cuadro de mensaje y se cerrará la ventana secundaria (Copie el código en un controlador de eventos cargado de una Ventana).
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
Button button = new Button() { Content="MessageBox"};
button.Click += delegate {
MessageBox.Show("Klicking her breaks the focus-chain."); };
firstChildWindow.Content = button;
firstChildWindow.Show();
También este ejemplo se rompe la cadena de enfoque:
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
firstChildWindow.Show();
Window secondChildWindow = new Window() {
Title="Second Window",Width=100,Height=70};
secondChildWindow.Content = new TextBlock() {
Text="SecondWindow"};
secondChildWindow.Owner = firstChildWindow;
secondChildWindow.Show();
tiene a alguien una solución para este problema. Pienso en un truco para desencadenar dando enfoque al padre después del cierre, con Dispatcher o DispachterTimer o quizás sería trabajo forzar manualmente el foco al padre en el cerrado, pero todo esto me parece muy sucio (y también es un poco complicado si hay ventanas de propiedad más activa del mismo padre, como tengo en mi aplicación actual).
¿Nadie conoce una solución clara para esto?
Recursos
MSDN Description (véase el recuadro de comentarios para las ventanas no modales abiertos llamando Mostrar())
Same problem on msdn forums without appropriate solution
Por favor, véase también: Instable focus of WPF apps
He entendido mal su pregunta, lo siento, he borrado mi respuesta. – Nir
No hay problema, gracias por la respuesta de todos modos. Cambié la descripción para explicar mi problema un poco más claro :) – HCL