2010-01-04 15 views
6

En una aplicación de WPF me gustaría poner en práctica el siguiente comportamiento que no parece funcionar sencillo:¿Cómo implementar correctamente un diálogo modal en la parte superior de un diálogo no modal?

Desde la ventana principal (Window1) el usuario abre una ventana no modal (Window2), y que no la ventana modal puede mostrar un cuadro de diálogo modal (Window3).

El problema es que cada vez que se muestra el diálogo modal, la ventana principal desaparece en el fondo (dado que hay ventanas de otras aplicaciones abiertas) cuando el usuario cierra los cuadros de diálogo.

¿Hay algún problema en la forma en que uso Window.Owner y Window.Show()/Window.ShowDialog(), es un error o simplemente no es compatible?

La siguiente sencilla aplicación WPF muestra este comportamiento:

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> 

ACTUALIZACIÓN: Copia fija & pegue el error en el código. Esto es .NET 3.5 SP1 en caso de que importe.

Respuesta

8

Microsoft confirms this as a bug en WPF:

Esto no es una regresión de las versiones anteriores por lo que no hace la barra que se fije para esta versión del producto. Veremos esto para una versión futura.

Mientras tanto, esto puede solucionarse activando la ventana del propietario cuando se cierra la ventana secundaria.

Código de ejemplo:

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

(Tenga en cuenta que la solución siempre traerá la ventana principal en primer plano lo que podría ser diferente que el comportamiento esperado)

Cuestiones relacionadas