2012-03-24 16 views
6

Sto usando ShowDialog() con WindowStyle = WindowStyle.SingleBorderWindow; per aprire una finestra modale nella mia applicazione WPF (MVVM), ma mi consente di navigare alla finestra principale utilizzando la barra delle applicazioni di Windows (Windows 7).ShowDialog() dietro la finestra principale

Ho trovato una risposta qui: WPF and ShowDialog() ma non è adatto a me perché non ho bisogno di una finestra degli strumenti "sempre in primo piano".

Grazie in anticipo

risposta

9

impostando la proprietà Owner della finestra di prova. Questo dovrebbe funzionare

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

Edit: Ho avuto un problema simile con questo con MVVM. Puoi risolvere questo problema usando i delegati.

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

Grazie, l'idea è buona. L'unico problema a questo punto è che nel ViewModel non ho informazioni sulla vista. Ho provato la 'App.Current.MainWindow' e funziona ma non è la soluzione migliore. Forse dovrei riconsiderare la struttura del mio pattern MVVM. – Oszkar

+1

Ho aggiunto una possibile soluzione per il problema MVVM. – MatthiasG

+0

@Oszkar Ho usato 'Application.Current.MainWindow' (Applicazione invece di App) e, poiché è statico - immagino - ha funzionato bene senza preoccupare MVVM. – heltonbiker

0

Aggiungi "ShowInTaskbar" e impostarlo su false.

1

Quando la finestra padre visualizza (e mostra) la finestra secondaria, è qui che è necessario impostare il proprietario.

public partial class MainWindow : Window 
{ 

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

Aditionally, se non si vuole una barra delle applicazioni in più per tutti i bambini ... poi

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

Cosa succede se 'this' non è una finestra? Sto eseguendo WPF da MFC e quindi non ho un'applicazione o la finestra principale. –

+0

Che cosa stai tentando di aprire? Basta visualizzare una finestra di dialogo? Se non si sta tentando di collegare una finestra di dialogo a una finestra, non capisco la domanda. – 00jt

+0

Come ho detto, "da MFC" ... Le classi MFC non derivano dalla finestra di WPF. Recentemente ho scoperto WindowInteropHelper.Owner ... anche se con questo finiamo con le finestre di dialogo modali nascoste. –

2

ho avuto questo problema, ma come la finestra era stata aperta da un modello di vista I didn avere un riferimento alla finestra corrente Per ovviare a ciò che ho usato questo codice:

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

È possibile utilizzare: myWindow.Owner = Application.Current.MainWindow;

Tuttavia, questo metodo provoca problemi se si dispone di tre finestre aperte come questo:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

Poi impostazione ChildWindow2 .Owner = Application.Current.MainWindow imposterà il proprietario della finestra come finestra dei nonni, non come finestra padre.

0

Anche se questo post è un po 'vecchio, spero che sia corretto postare la mia soluzione. Tutti i risultati sopra riportati sono noti a me e non hanno prodotto esattamente il risultato desiderato.

lo sto facendo per gli altri Googler :)

permette di dire f2 è la vostra finestra che si desidera visualizzare sulla parte superiore del f1:

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

Questo è tutto, prometto che non scomparirà !

HTH Guy

0

Gran parte del motivo per il modello MVVM è così che la logica di interazione può essere unità testato. Per questo motivo, non dovresti mai aprire direttamente una finestra da ViewModel, o avrai finestre di dialogo che spuntano nel bel mezzo dei tuoi test di unità.

Invece, dovresti generare un evento che la Vista gestirà e aprirà una finestra di dialogo per te.Ad esempio, consulta questo articolo sulle richieste di interazione: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12