2010-01-04 9 views
6

In einer WPF-Anwendung würde Ich mag das folgende Verhalten implementieren, die einfach nicht zu funktionieren scheinen:Wie kann man einen modalen Dialog auf einem nicht-modalen Dialog korrekt implementieren?

aus dem Hauptfenster (Window1) öffnet der Benutzer ein nicht-modalen Fenster (Window2), und das nicht Das modale Fenster zeigt möglicherweise einen modalen Dialog an (Window3).

Das Problem ist, dass, wenn der modale Dialog angezeigt wurde, das Hauptfenster im Hintergrund verschwindet (da Fenster anderer Anwendungen geöffnet sind), wenn der Benutzer die Dialoge schließt.

Gibt es etwas falsch in der Art, dass ich Window.Owner und Window.Show()/Window.ShowDialog() verwende, ist es ein Fehler oder wird es einfach nicht unterstützt?

Die folgende einfache WPF-Anwendung veranschaulicht dieses Verhalten:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Window2 win = new Window2(); 
     win.Owner = this; 
     win.Show(); 
    } 
} 

public partial class Window2 : Window 
{ 
    public Window2() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Window3 win = new Window3(); 
     win.Owner = this; 
     win.ShowDialog(); 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

public partial class Window3 : Window 
{ 
    public Window3() 
    { 
     InitializeComponent(); 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

XAML Window1:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1"> 

    <Button Click="Button_Click">Show non-modal window</Button> 
</Window> 

XAML Window2:

<Window x:Class="WpfApplication1.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window2"> 
    <StackPanel> 
     <Button Click="Button_Click">Show modal dialog</Button> 
     <Button Name="btnClose" Click="btnClose_Click">Close</Button> 
    </StackPanel> 
</Window> 

XAML Window3:

<Window x:Class="WpfApplication1.Window3" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window3"> 

    <Button Name="btnClose" Click="btnClose_Click">Close</Button> 
</Window> 

UPDATE: Korrigierte Kopie & einfügen Fehler im Code. Dies ist .NET 3.5 SP1, falls es darauf ankommt.

Antwort

8

Microsoft confirms this as a bug in WPF:

Die von früheren Versionen nicht eine Regression ist, so dass es für diese Version des Produkts festgelegt nicht die Bar machen werden. Wir werden das für eine zukünftige Version prüfen.

In der Zwischenzeit kann dies durch Aktivieren des Besitzerfensters beim Schließen des untergeordneten Fensters behoben werden.

Beispielcode:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void NonModalButtonClick(object sender, RoutedEventArgs e) 
    { 
     new Window1 { Owner = this }.Show(); 
    } 

    private void ModalButtonClick(object sender, RoutedEventArgs e) 
    { 
     new Window1 { Owner = this }.ShowDialog(); 
    } 

    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     if (this.Owner != null) 
     { 
      this.Owner.Activate(); 
     } 
    } 
} 

(Beachten Sie, dass die Problemumgehung wird immer das Hauptfenster in den Vordergrund bringen, die als das erwartete Verhalten anders sein könnte)