我有以下简单的wpf应用程序:
App.xaml中:
<Application x:Class="TestWpf2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>
Run Code Online (Sandbox Code Playgroud)
App.xaml.cs:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
var parentWindow = new Window();
parentWindow.Show();
var childWindow1 = new Window { Owner = parentWindow };
childWindow1.Show();
var childWindow2 = new Window { Owner = parentWindow };
childWindow2.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序导致3个窗口出现在屏幕上.如果运行应用程序并关闭两个子窗口,父窗口将最小化到任务栏.如果注释掉childWindow2.show(),运行应用程序,并关闭单个子窗口,则父窗口不会最小化到任务栏.
我可以添加以下代码来解决此问题:
childWindow1.Closing += delegate(object sender, CancelEventArgs ex)
{
(sender as Window).Owner = null;
};
Run Code Online (Sandbox Code Playgroud)
但我不想使用这样的黑客,我想了解为什么会出现这个问题.
为什么会这样?
Cha*_*thJ 17
这是一个WPF未记录的功能(Bug)
这个错误已经在7年多前向微软报告过了.
WPF团队最近审查了这个问题,并且不会解决这个问题,因为此时团队正在关注影响最多WPF开发人员的错误.
让我们看一下这个未记录的功能的行为.
它没有最小化,只是在后面的一个窗口(在调试模式下,在visual studio窗口后面)
证明的步骤:
运行此应用程序.
最小化所有其他窗口(例如:visual studio和所有其他窗口).只在屏幕上保留这三个窗口.
关闭这两个孩子,父母仍在Normal州
测试此代码以获得进一步证明:
StateChange不会触发.
protected override void OnStartup(StartupEventArgs e)
{
var parentWindow = new Window() { Title = "Parent" };
parentWindow.StateChanged += (sender, ep)=>
{
var state = ((Window)sender).WindowState;
};
parentWindow.Show();
var childWindow1 = new Window { Owner = parentWindow, Title = "Child1" };
childWindow1.Show();
var childWindow2 = new Window { Owner = parentWindow, Title = "Child2" };
childWindow2.Show();
}
Run Code Online (Sandbox Code Playgroud)
成为TopMost可以防止这种情况发生
如果父窗口是TopMost,则不会发生这种情况.但在许多情况下,这可能不是一种选择.
parentWindow.Topmost = true;
Run Code Online (Sandbox Code Playgroud)
解决方法
激活child2关闭时的父级.
childWindow2.Closed += (a, b) => { parentWindow.Activate(); };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2764 次 |
| 最近记录: |