2010-01-04 150 views
6

在WPF應用程序,我想實現以下行爲,似乎不工作直截了當:如何在非模態對話框上正確實現模態對話框?

從主窗口(Window1)用戶打開一個非模態窗口(Window2),以及非模態窗口可能會顯示一個模態對話框(Window3)。

問題是,無論何時顯示模態對話框,當用戶關閉對話框時,主窗口會在後臺消失(假設有其他應用程序打開的窗口)。

我用Window.OwnerWindow.Show()/Window.ShowDialog()的方式有什麼問題嗎?它是一個錯誤還是它不被支持?

下面這個簡單的WPF應用程序演示了此行爲:

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> 

更新:修復複製&代碼中粘貼錯誤。這是.NET 3.5 SP1以防萬一。

回答

8

微軟confirms this as a bug在WPF:

這是不是從以前的版本中迴歸所以它沒有被固定爲這個版本的產品吧。我們將考慮未來版本。

與此同時,這可以通過在子窗口關閉時激活所有者窗口來解決。

示例代碼:

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

(注意,解決方法將總是把主要窗口前景可能比預期的行爲不同)