2012-03-24 20 views
6

Ich verwende ShowDialog() mit WindowStyle = WindowStyle.SingleBorderWindow;, um ein modales Fenster in meiner WPF (MVVM) -Anwendung zu öffnen, aber ich kann über die Windows-Taskleiste (Windows 7) zum übergeordneten Fenster navigieren.ShowDialog() hinter dem übergeordneten Fenster

Ich habe hier eine Antwort gefunden: WPF and ShowDialog() aber es ist nicht für mich geeignet, weil ich kein "immer oben" -Werkzeugfenster brauche.

Vielen Dank im Voraus

Antwort

9

Versuchen Sie, die Owner Eigenschaft des Dialogs festlegen. Das sollte funktionieren.

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

Edit: Ich hatte ein ähnliches Problem mit diesem mit MVVM. Sie können dies mithilfe von Delegaten lösen.

+0

Vielen Dank, die Idee ist gut. Das einzige Problem an diesem Punkt ist, dass ich im ViewModel keine Informationen über die Ansicht habe. Ich habe versucht das 'App.Current.MainWindow' und es funktioniert, aber nicht die schönste Lösung. Vielleicht sollte ich die Struktur meines MVVM-Musters überdenken. – Oszkar

+1

Ich habe eine mögliche Lösung für das MVVM-Problem hinzugefügt. – MatthiasG

+0

@Oszkar Ich habe 'Application.Current.MainWindow' (Anwendung statt App) verwendet und, da es statisch ist - ich schätze - es hat gut funktioniert, ohne MVVM zu stören. – heltonbiker

0

"ShowInTaskbar" hinzufügen und auf false setzen.

1

Wenn das übergeordnete Fenster das untergeordnete Fenster erstellt (und anzeigt), müssen Sie dort den Besitzer festlegen.

public partial class MainWindow : Window 
{ 

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

Aditionally, wenn Sie für alle Kinder keine zusätzliche Taskleiste wollen ... dann

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

Was ist, wenn 'this' kein Fenster ist? Ich führe WPF von MFC und so habe ich keine Anwendung oder Hauptfenster. –

+0

Was möchten Sie öffnen? Nur einen Dialog anzeigen? Wenn Sie nicht versuchen, einen Dialog an ein Fenster anzuhängen, verstehe ich Ihre Frage nicht. – 00jt

+0

Wie ich schon sagte, "von MFC" ... MFC-Klassen sind nicht aus WPF-Fenster abgeleitet. Ich habe kürzlich WindowInteropHelper.Owner entdeckt ... obwohl wir damit auch versteckte modale Dialoge haben. –

2

hatte ich dieses Problem aber als Fenster wurde aus einer Ansicht Modell geöffnet I didn habe keinen Verweis auf das aktuelle Fenster. Um um sie herum habe ich diesen Code:

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

Sie verwenden können: myWindow.Owner = Application.Current.MainWindow;

Allerdings ist diese Methode führt zu Problemen, wenn Sie drei Fenster geöffnet haben, wie folgt aus:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

Dann Einstellung ChildWindow2 .Owner = Application.Current.MainWindow wird den Besitzer des Fensters als sein Großelternfenster festlegen, nicht als übergeordnetes Fenster.

0

Auch wenn dieser Beitrag ein bisschen alt ist, hoffe ich, dass es OK ist, dass ich meine Lösung poste. Alle obigen Ergebnisse sind mir bekannt und haben nicht genau zum gewünschten Ergebnis geführt.

ich es für die anderen Googler tue :)

Lets sagen f2 Ihre Fenster, das Sie oben auf f1 angezeigt werden soll:

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

Das ist es, ich verspreche es wird nicht verschwinden !

HTH Guy

0

Ein großer Teil der Grund für das MVVM-Muster ist so, dass Ihre Interaktion Logikeinheit getestet werden kann. Aus diesem Grund sollten Sie nie direkt ein Fenster aus dem ViewModel öffnen, oder Sie werden in der Mitte der Komponententests Dialogfenster öffnen.

Stattdessen sollten Sie ein Ereignis auslösen, das von der Ansicht gehandhabt wird, und einen Dialog für Sie öffnen.Siehe zum Beispiel in diesem Artikel über Interaction Requests: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

Verwandte Themen