2012-03-24 12 views
6

Estoy usando ShowDialog() con WindowStyle = WindowStyle.SingleBorderWindow; para abrir una ventana modal en mi aplicación WPF (MVVM), pero me permite navegar a la ventana primaria usando la barra de tareas de Windows (Windows 7).ShowDialog() detrás de la ventana principal

He encontrado una respuesta aquí: WPF and ShowDialog() pero no es adecuado para mí porque no necesito una ventana de herramienta "siempre en la parte superior".

Gracias de antemano

Respuesta

9

establecer la propiedad Owner del diálogo intento. Eso debería funcionar.

Window dialog = new Window(); 
dialog.Owner = mainWindow; 
dialog.ShowDialog(); 

Editar: que tenía un problema similar usando esto con MVVM. Puedes resolver esto usando delegados.

public class MainWindowViewModel 
{ 
    public delegate void ShowDialogDelegate(string message); 
    public ShowDialogDelegate ShowDialogCallback; 

    public void Action() 
    { 
     // here you want to show the dialog 
     ShowDialogDelegate callback = ShowDialogCallback; 
     if(callback != null) 
     { 
      callback("Message"); 
     } 
    } 
} 

public class MainWindow 
{ 
    public MainWindow() 
    { 
     // initialize the ViewModel 
     MainWindowViewModel viewModel = new MainWindowViewModel(); 
     viewModel.ShowDialogCallback += ShowDialog; 
     DataContext = viewModel; 
    } 

    private void ShowDialog(string message) 
    { 
     // show the dialog 
    } 
} 
+0

Gracias, la idea es buena. El único problema en este punto es que en ViewModel no tengo información de la Vista. Probé la 'App.Current.MainWindow' y funciona pero no es la mejor solución. Tal vez debería reconsiderar la estructura de mi patrón MVVM. – Oszkar

+1

Agregué una posible solución para el problema de MVVM. – MatthiasG

+0

@Oszkar Usé 'Application.Current.MainWindow' (Aplicación en lugar de la Aplicación) y, dado que es estático, supongo, funcionó bien sin molestar a MVVM. – heltonbiker

0

Agregue "ShowInTaskbar" y configúrelo en falso.

1

Cuando la ventana principal hace (y muestra) la ventana secundaria, ahí es donde debe establecer el propietario.

public partial class MainWindow : Window 
{ 

    private void openChild() 
    { 
     ChildWindow child = new ChildWindow(); 
     child.Owner = this; // "this" is the parent 
     child.ShowDialog(); 
    } 
} 

Adicionalmente, si no se desea una barra de tareas adicional a todos los niños ... entonces

<Window x:Class="ChildWindow"   
     ShowInTaskbar="False" > 
</Window> 
+0

¿Qué pasa si 'this' no es una ventana? Estoy ejecutando WPF desde MFC, por lo que no tengo ninguna aplicación o ventana principal. –

+0

¿Qué estás tratando de abrir? ¿Solo mostrar un diálogo? Si no está tratando de adjuntar un cuadro de diálogo a una ventana, no entiendo su pregunta. – 00jt

+0

Como dije, "desde MFC" ... las clases de MFC no se derivan de la ventana de WPF. Recientemente descubrí WindowInteropHelper.Owner ... aunque incluso con eso terminamos con diálogos modales ocultos. –

2

que tenía este problema, sino como la ventana se abría de un modelo de vista yo no no tiene una referencia a la ventana actual. Para recibir todo el año que he utilizado este código:

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

que puede utilizar: myWindow.Owner = Application.Current.MainWindow;

Sin embargo, este método provoca problemas si tiene tres ventanas abiertas así:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

Entonces el establecimiento ChildWindow2 .Owner = Application.Current.MainWindow configurará el propietario de la ventana para que sea su ventana de abuelos, no la ventana principal.

0

Incluso si esta publicación es un poco antigua, espero que esté bien que publique mi solución. Conozco todos los resultados anteriores y no obtuve exactamente el resultado deseado.

lo estoy haciendo para los demás empleados de Google :)

digamos que f2 es la ventana que desea mostrar en la parte superior de la F1:

f2.Owner = Window.GetWindow(this); 
f2.ShowDialog(); 

Eso es todo, te prometo que no va a desaparecer !

HTH individuo

0

Gran parte de la razón para el patrón MVVM es para que su lógica de interacción se puede probar la unidad. Por este motivo, nunca debe abrir directamente una ventana desde el ViewModel, o aparecerá un cuadro de diálogo en medio de las pruebas de su unidad.

En su lugar, debe plantear un evento que manejará la Vista y abrir un cuadro de diálogo para usted.Por ejemplo, consulte este artículo sobre Solicitudes de interacción: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

Cuestiones relacionadas