2010-01-04 19 views
6

In un'applicazione WPF mi piacerebbe implementare il seguente comportamento che non sembra funzionare semplice:Come implementare correttamente una finestra di dialogo modale in cima a una finestra di dialogo non modale?

Dalla finestra principale (Window1) l'utente apre una finestra non modale (Window2), e che non la finestra modale potrebbe visualizzare una finestra di dialogo modale (Window3).

Il problema è che ogni volta che viene visualizzata la finestra di dialogo modale, la finestra principale scompare sullo sfondo (dato che ci sono finestre di altre applicazioni aperte) quando l'utente chiude le finestre di dialogo.

C'è qualcosa di sbagliato nel modo in cui io uso Window.Owner e Window.Show()/Window.ShowDialog(), è un bug o è semplicemente qualcosa non supportato?

La seguente applicazione semplice WPF illustrato questo comportamento:

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: copia fissa & errore di incisione nel codice. Questo è .NET 3.5 SP1 nel caso abbia importanza.

risposta

8

Microsoft confirms this as a bug in WPF:

Questa non è una regressione rispetto alle versioni precedenti in modo da non rendere la barra da fissare per questa versione del prodotto. Analizzeremo questo aspetto per una versione futura.

Nel frattempo, questo può essere risolto attivando la finestra del proprietario quando la finestra secondaria si sta chiudendo.

codice di esempio:

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(); 
     } 
    } 
} 

(Si noti che la soluzione porterà sempre la finestra principale in primo piano che potrebbe essere diverso da quello del comportamento previsto)

Problemi correlati