2012-05-25 20 views
16

que tienen la siguiente sencilla aplicación WPF:¿Por qué el cierre de la última ventana secundaria minimiza su ventana principal?

App.xaml:

<Application x:Class="TestWpf2.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</Application> 

App.xaml.cs:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     var parentWindow = new Window(); 
     parentWindow.Show(); 

     var childWindow1 = new Window { Owner = parentWindow }; 
     childWindow1.Show(); 

     var childWindow2 = new Window { Owner = parentWindow }; 
     childWindow2.Show(); 
    } 
} 

La aplicación hace 3 ventanas a aparecer en la pantalla. Si ejecuta la aplicación y cierra las dos ventanas secundarias, la ventana principal se minimiza a la barra de tareas. Si comenta childWindow2.show(), ejecuta la aplicación y cierra la ventana secundaria única, la ventana primaria no se minimiza en la barra de tareas.

puedo añadir el siguiente código para evitar este problema:

childWindow1.Closing += delegate(object sender, CancelEventArgs ex) 
{ 
    (sender as Window).Owner = null; 
}; 

pero yo no desee utilizar un truco como este, y quiero entender por qué se produce este problema.

¿Por qué sucede esto?

+0

No se minimiza, simplemente pierde el foco y se esconde detrás de otra ventana. Como la ventana principal de Visual Studio. Agregar ShowActivated = false al inicializador de ventana hijo es una forma de solucionarlo. –

+0

@HansPassant ShowActivated solo evita que las ventanas secundarias se activen cuando se crean. Si el usuario hace clic en ellos para activarlos, luego los cierra, la ventana principal aún pierde el foco. – Oliver

+1

https://connect.microsoft.com/VisualStudio/feedback/details/523197/modal-dialog-on-top-of-non-modal-window-sends-main-window-to-back –

Respuesta

3

Esto se debe al hecho de que no puede usar la ventana principal una vez que se muestra la ventana secundaria con el conjunto Propietario. Intente acceder a la ventana principal mientras el niño está en la pantalla, y no le permitirá ver lo que quiero decir.

Si no especifica Propietario, entonces este comportamiento no ocurre.

+1

No creo que este sea el caso. Con el conjunto Propietario, aún puede interactuar con la ventana principal. La ventana secundaria se ve obligada a estar en la parte superior del elemento primario, pero el elemento principal sigue respondiendo a la entrada. – Oliver

1

¡Nunca he averiguado qué está causando esto! Al final, he escrito el código que se llama después de cualquier ventana secundaria está cerrada:

// App inherits from Application, and has a Window property called MainWindow 
// and a List<Window> property called OpenWindows. 
if (!App.OpenWindows.Any()) 
    App.ParentWindow.Activate(); 

lo tanto, si la ventana está cerrada último hijo (haciendo App.OpenWindows.Any() falsa) se activa la ventana padre. Esto no produce parpadeo (la ventana principal minimiza y luego maximiza, por ejemplo).

Esta no es la mejor solución. No cerraré esta pregunta con la esperanza de que alguien pueda explicar por qué WPF tiene esta funcionalidad.

14

Esta es una característica no documentada WPF (Bug)

Este error se ha informado a Microsoft hace más de 7 años.

Modal dialog on top of non-modal window sends main window to back.

El equipo de WPF ha revisado recientemente esta cuestión y no habrá hacer frente a este problema ya que en este momento el equipo se está centrando en los errores que afectan el mayor número de desarrolladores de WPF.

Veamos el comportamiento de esta característica no documentada un poco.

no minimiza, sólo tiene que ir detrás de una ventana (en modo de depuración, detrás de la ventana de Visual Studio)

pasos necesarios para probar:

  • ejecutar esta aplicación.

  • Minimice todas las demás ventanas (por ejemplo: visual studio y todas las demás ventanas). Mantenga solo estas tres ventanas en la pantalla.

  • Cerrar ambos niños, los padres se encuentra todavía en estado Normal

Prueba este código para una prueba más: StateChange no habría fuego.

 protected override void OnStartup(StartupEventArgs e) 
     { 
      var parentWindow = new Window() { Title = "Parent" }; 
      parentWindow.StateChanged += (sender, ep)=> 
      { 
       var state = ((Window)sender).WindowState; 
      }; 
      parentWindow.Show(); 

      var childWindow1 = new Window { Owner = parentWindow, Title = "Child1" }; 
      childWindow1.Show(); 

      var childWindow2 = new Window { Owner = parentWindow, Title = "Child2" }; 
      childWindow2.Show(); 
     } 

Ser TopMost impedir que esto suceda

Si ventana padre es TopMost, esto no sucede. Pero esto puede no ser una opción en muchos casos.

parentWindow.Topmost = true; 

Solución

Active la matriz en child2 cerca.

childWindow2.Closed += (a, b) => { parentWindow.Activate(); }; 
+0

'simplemente ve uno detrás de la ventana del estudio visual' correcto, pero no solo VS, sino también detrás de cualquier otra ventana no minimizada, y no solo en tiempo de depuración. – dovid

+0

@lomed: Correcto, va solo una ventana detrás. – CharithJ

Cuestiones relacionadas