2011-03-28 9 views
12

¿Es posible obtener algunas de las funcionalidades de Window.Owner sin obtener todo?Propietario de la ventana en WPF sin comportamiento siempre en la parte superior

Hay dos ventanas, la ventana A y la ventana B. Quiero hacerlo de manera que al seleccionar una de ellas las coloque encima de otras aplicaciones, pero una puede superponerse a la otra. (En realidad hay más de dos, pero todos deben comportarse de manera similar.)

Si configuro la ventana B como Owner en A, entonces el cambio a cualquiera de las ventanas traerá ambos frente a otras aplicaciones (que yo quiero), pero también obligará a B a sentarse siempre encima de A (que no quiero).

De hecho, ya tengo un código que rastrea la jerarquía de ventanas independientemente de Owner/OwnedWindows, por lo que probablemente pueda extender eso para solucionar el problema de activación. Entonces, si eso simplifica el problema, una respuesta alternativa que estoy buscando es:

¿Cómo puedo hacer "cuando esta ventana es activada por el usuario, traiga un conjunto específico de ventanas (todas las demás en la aplicación)? al orden Z justo debajo de mí, mientras se preservan sus Z-órdenes existentes entre sí "?

+1

+1 Tengo el mismo requisito; ¿Ya encontraste una solución? Para su pregunta de orden z: puede hacerlo guardando una pila (solo una Lista ) y registrándose para el evento Activado de todas sus ventanas. En cada evento, eliminas el winodw de la pila y lo vuelves a poner encima (== list.Add). La ventana de foreach en la lista lo cruza al primer plano (usando la interoperabilidad). – stijn

+0

No he encontrado otra solución todavía. La respuesta de Todd a continuación parece prometedora y es probable que sea la que usaré (a menos que surja algo mejor), pero aún no he podido probarla, ya que el proyecto para el que fue esto se ha retrasado. (Por eso aún no he marcado la respuesta. Lo prometo, ¡volveré a hacerlo eventualmente!) – Miral

Respuesta

4

Una posible solución sería tener una ventana oculta que posea todas las ventanas en su aplicación.

Usted podría declarar algo como:

<Window 
    Opacity="0" 
    ShowInTaskbar="False" 
    AllowsTransparency="true" 
    WindowStyle="None"> 

Asegúrese de retirar StartupUri de su App.xaml. Y en su App.xaml.cs que anularía OnStartup a ser algo como:

protected override void OnStartup(StartupEventArgs e) 
{ 
    HiddenMainWindow window = new HiddenMainWindow(); 
    window.Show(); 

    Window1 one = new Window1(); 
    one.Owner = window; 
    one.Show(); 

    Window2 two = new Window2(); 
    two.Owner = window; 
    two.Show(); 
} 

Otra dificultad será cómo quiere gestionar el cierre de la aplicación real. Si una de estas ventanas se considera MainWindow, puede simplemente cambiar la aplicación ShutdownMode a ShutdownMode.OnMainWindowClose y luego establecer la propiedad MainWindow en cualquiera de esas ventanas. De lo contrario, deberá determinar cuándo se cierran todas las ventanas y llamar a Shutdown explícitamente.

+0

esto es en realidad casi perfecto. Manejar el cierre/minimizar/restaurar no es muy difícil, ya que estoy usando un agregador de eventos. Simplemente publico eventos al crear/cambiar ventanas y mantengo una lista central de todos ellos. El único retiro que encontré es que en alt-tab Windows mostrará una entrada vacía (a excepción de un ícono) debido a la ventana transparente del propietario. – stijn

Cuestiones relacionadas