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 です。

4

1 に答える 1

8

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

(回避策は常にメイン ウィンドウを前面に表示し、予想される動作とは異なる場合があることに注意してください)

于 2010-01-14T12:17:46.317 に答える