如果从隐藏窗口调用,ShowDialog()会提前结束

时间:2015-06-16 09:03:46

标签: c# wpf showdialog

考虑以下代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Title = DateTime.Now.ToString();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Hide();
        new MainWindow().ShowDialog();
        Show();
        Debug.WriteLine(Title);
    }
}

XAML很简单:

<Window x:Class="ShowHide.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button
            Content="Test"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Click="Button_Click"/>
    </Grid>
</Window>

如果我“向上”,它按预期工作 - this窗口被隐藏,新的窗口被创建并显示为模态窗口。但当我关闭当前可见的窗口时,所有隐藏的窗口“在下面”立即显示,它们不再是模态。输出窗口中出现多行。

然而,如果我注释掉Hide()电话,问题似乎不会出现,即我会逐一关闭模态窗口。

重现:

  1. 运行代码。
  2. 按“测试”按钮。当前窗口将隐藏,新窗口将出现。
  3. 按下新窗口中的“测试”按钮。将再次创建另一个窗口。您可以根据需要多次重复此步骤。
  4. 关闭窗口。较旧的窗口将立即重新出现,并且都不是模态的。
  5. 这是设计的吗?你的解决方法是什么?

2 个答案:

答案 0 :(得分:3)

这是设计隐藏模态窗口并使用Show()而非ShowDialog()再次显示,因此您可以修改代码,如下所示:

bool isChild;

private void Button_Click(object sender, RoutedEventArgs e)
{
    Hide();
    new MainWindow() { isChild = true }.ShowDialog();

    if (isChild)
    {
        ShowDialog();
    }
    else
    {
        Show();
    }
}

答案 1 :(得分:1)

代码就像你写的一样工作。你调用方法Show(),但你应该编写ShowDialog()。只需更改此代码:

 Hide();
 new MainWindow().ShowDialog();
 Show();

要:

  Hide();
 new MainWindow().ShowDialog();
 ShowDialog();