Dir*_*mar 6 c# wpf modal-dialog non-modal
在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();
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
更新:修复了代码中的复制和粘贴错误.这是.NET 3.5 SP1,如果它很重要.
这不是以前版本的回归,因此它不会为此版本的产品修复该栏.我们将在未来的版本中研究这个问题.
与此同时,这可以通过在子窗口关闭时激活所有者窗口来解决.
示例代码:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
(请注意,解决方法将始终将主窗口置于前景中,这可能与预期的行为不同)