2010-01-04 5 views
6

В приложении WPF я хотел бы реализовать следующее поведение, которое не похоже на работу простой:Как правильно реализовать модальный диалог сверху немодального диалога?

В главном окне (Window1) пользователь открывает немодальное окно (Window2), и что неравно- модальное окно может отображать модальный диалог (Window3).

Проблема в том, что всякий раз, когда отображается модальное диалоговое окно, основное окно исчезает в фоновом режиме (при условии, что открываются окна других приложений), когда пользователь закрывает диалоги.

Есть ли что-то неправильное в том, как я использую Window.Owner и Window.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 Microsoft в 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(); 
     } 
    } 
} 

(Обратите внимание, что обходной путь всегда приведет главное окно на передний план, который может отличаться от ожидаемого поведения)