wpf showdialog

wpf - El diálogo modal no se muestra sobre otras ventanas



showdialog (5)

Había que hacer un poco de modificación. Tuve que configurar el propietario y activar la ventana. Verifique la ventana emergente y active la ventana como se indica a continuación.

var enumerator = Application.Current.Windows.GetEnumerator(); while (enumerator.MoveNext()) { Window window = (Window)enumerator.Current; if (window != null && window.GetType() == typeof(PopUpWindow)) { window.Activate(); } }

Estoy usando Window.ShowDialog() para abrir una ventana modal en mi aplicación WPF (MVVM), pero me permite navegar a otras ventanas usando la barra de tareas de Windows (Windows 7).

Considere esto: Tengo 3 ventanas no modales abiertas en mi aplicación. Ahora, uno de estos abre una ventana modal usando Window.ShowDialog() . También configuré Application.MainWindow como el propietario de la ventana modal. Esto es así porque estoy usando la mensajería MVVM y el controlador de mensajes para abrir una nueva ventana está centralizado en App.xaml.cs La ventana se abre modalmente, sin problemas. Sin embargo, Windows 7 me permite pasar a las otras ventanas de la aplicación desde la barra de tareas. Esto conduce a una situación en la que la ventana modal va detrás de otra ventana, que prefiero no tener.

No puedo hacer nada en otras ventanas siempre que tenga el modo abierto, pero sería bueno si la ventana modal permaneciera siempre en la parte superior mientras esté abierto. ¿Hay alguna manera de que pueda desactivar el cambio de la barra de tareas cuando el modal está abierto? FYI: todas las ventanas abiertas lanzadas desde la aplicación aparecen como entradas separadas en la barra de tareas.

¡Gracias por adelantado!


La configuración de Topmost a True (Topmost = True) hace que el diálogo esté en la parte superior de todas las ventanas del sistema (no solo en la aplicación).

Así que puedes intentar registrar el evento Activado en tu ventana principal:

Activated += WindowActivated;

y active una ventana de propietario del diálogo modal cada vez que se active otra ventana principal de su aplicación.

private void WindowActivated(object sender, EventArgs e) { Window window = Application.Current.Windows.OfType<YourMainWindow>().FirstOrDefault(p => p != this && !p.IsActive && p.OwnedWindows.Count > 0); if (window != null) { window.Activate(); } }

Este simple truco asume que todas las ventanas de sus hijos son modales, pero puede escribir una lógica más sofisticada.


No hay ningún código para basar esto, pero parece que ha dejado de lado algunas propiedades en la Window que ha creado y esperaba que ShowDialog aplicara semántica de "diálogo" adicional:

Window window = new Window() { Title = "Modal Dialog", ShowInTaskbar = false, // don''t show the dialog on the taskbar Topmost = true, // ensure we''re Always On Top ResizeMode = ResizeMode.NoResize, // remove excess caption bar buttons Owner = Application.Current.MainWindow, }; window.ShowDialog();


Simplemente establezca la propiedad del propietario de la ventana a la ventana de llamada. Luego, la activación de la aplicación WPF en la barra de tareas no solo activa MainWindow sino también la ventana secundaria modal y la lleva al frente.

ChildWindow C = new ChildWindow(); C.Owner = this; C.ShowDialog();


Terminé usando una combinación de un par de respuestas aquí. La respuesta aceptada fue útil al principio, pero como otras personas aquí indicaron que configurar Topmost = true significa que la ventana siempre está por encima de cualquier otra aplicación que se esté ejecutando. Mi solución fue la siguiente:

var myWindow = new MyWindowType(); myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

Inicialmente utilicé:

myWindow.Owner = Application.Current.MainWindow;

Sin embargo, este método causa problemas si tiene tres ventanas abiertas como esta:

MainWindow | -----> ChildWindow1 | -----> ChildWindow2

Luego, al configurar ChildWindow2.Owner = Application.Current.MainWindow , el propietario de la ventana será su ventana de abuelo, no la ventana principal.

Para acelerar las cosas, lo he agregado como un fragmento de código en Visual Studio. Si agrega lo siguiente a Herramientas -> Administrador de fragmentos de código -> Mis fragmentos de código:

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>MVVM Set owner of page to be current active window</Title> <Shortcut>owner</Shortcut> </Header> <Snippet> <Code Language="CSharp"> <![CDATA[System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>

Escribir ''propietario'' y presionar dos veces la tecla de tabulación agregará la parte '' Application.CurrentWindows... '' por usted automáticamente.