如果从隐藏 windows 调用 ShowDialog() 会提前结束
ShowDialog() ends prematurely if called from hidden windows
考虑这段代码:
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>
如果我去 "up",它会按预期工作 - this
window 被隐藏,新的被创建并显示为模态 window。但是当我关闭当前可见的 window 时,所有隐藏的 windows "underneath" 都会立即显示出来并且它们不再是模态的。输出中出现多行 window.
但是,如果我注释掉 Hide()
调用,问题似乎不会出现,即我可以反向关闭模态 windows。
重现:
- 运行代码。
- 按 "Test" 按钮。当前的window会隐藏,新的会出现
- 在新的 window 中按 "Test" 按钮。将再次创建另一个 window。您可以根据需要多次重复此步骤。
- 关闭window。较旧的 windows 将立即重新出现,并且都不是模态的。
这是设计使然吗?您的解决方法是什么?
这是设计使然,因为您隐藏模态框 window 并使用 Show()
而不是 ShowDialog()
再次显示它,因此您可以按如下方式修改代码:
bool isChild;
private void Button_Click(object sender, RoutedEventArgs e)
{
Hide();
new MainWindow() { isChild = true }.ShowDialog();
if (isChild)
{
ShowDialog();
}
else
{
Show();
}
}
代码就像你写的一样工作。您调用方法 Show(),但您应该编写 ShowDialog()。只需更改此代码:
Hide();
new MainWindow().ShowDialog();
Show();
收件人:
Hide();
new MainWindow().ShowDialog();
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>
如果我去 "up",它会按预期工作 - this
window 被隐藏,新的被创建并显示为模态 window。但是当我关闭当前可见的 window 时,所有隐藏的 windows "underneath" 都会立即显示出来并且它们不再是模态的。输出中出现多行 window.
但是,如果我注释掉 Hide()
调用,问题似乎不会出现,即我可以反向关闭模态 windows。
重现:
- 运行代码。
- 按 "Test" 按钮。当前的window会隐藏,新的会出现
- 在新的 window 中按 "Test" 按钮。将再次创建另一个 window。您可以根据需要多次重复此步骤。
- 关闭window。较旧的 windows 将立即重新出现,并且都不是模态的。
这是设计使然吗?您的解决方法是什么?
这是设计使然,因为您隐藏模态框 window 并使用 Show()
而不是 ShowDialog()
再次显示它,因此您可以按如下方式修改代码:
bool isChild;
private void Button_Click(object sender, RoutedEventArgs e)
{
Hide();
new MainWindow() { isChild = true }.ShowDialog();
if (isChild)
{
ShowDialog();
}
else
{
Show();
}
}
代码就像你写的一样工作。您调用方法 Show(),但您应该编写 ShowDialog()。只需更改此代码:
Hide();
new MainWindow().ShowDialog();
Show();
收件人:
Hide();
new MainWindow().ShowDialog();
ShowDialog();