Как правильно реализовать модальное диалоговое окно на вершине немодальное диалоговое окно?

В приложении 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>

ОБНОВЛЕНИЕ: Зафиксированная copy&paste ошибка в коде. Это-.NET 3,5 SP1 в случае, если она имеет значение.

6
задан H.B. 16 May 2012 в 19:20
поделиться

1 ответ

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

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

8
ответ дан 16 December 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: