在Vista/Windows 7上关闭WPF窗口时不会褪色
本文关键字:窗口 WPF 褪色 Vista Windows | 更新日期: 2023-09-27 18:00:40
我正在编写一个既是GDI又是WPF的示例应用程序。我有一个WPF窗口,它有一个按钮和一个点击处理程序,其主体如下:
this.DialogResult = true;
这将关闭WPF对话框。但是,关闭此对话框时,Windows 7/Vista上没有"淡入淡出"效果。或者,使用GDI窗口,淡入即可工作。我要么做错了什么,要么这是关闭WPF窗口时的默认行为。此外,使用X按钮关闭也会执行同样不需要的行为。
理想情况下,我希望两种类型的窗户都能以相同的风格关闭。其他人遇到过这种情况吗?对于所有的WPF窗口,这是一个很容易修复的问题吗?
编辑:好的,所以我注意到了一些非常有趣的事情。当要关闭的窗口在父窗口上而不是(例如,它被移动到另一个监视器)并关闭时,通常的淡入淡出会正确启动!但是,如果要关闭的窗口位于父窗口之上,则不会发生淡入淡出。美丽的
如果您的窗口是无边界的,
<Window
xmlns="blahblahblah"
AllowsTransparency="True" WindowStyle="None">
您可以将淡入淡出动画设置为透明,并编写一个关闭事件处理程序来调用动画,然后完成关闭。如果窗户有边框,我敢肯定边框会留在那里,看起来会更亮。
我已经想出了一个解决方案,尽管我认为实际上让fade工作仍然是的关键。我还用一个纯WPF应用程序进行了测试,该窗口仍然只有在而不是与其父窗口重叠时才会褪色。如果有人有比下面代码更好的解决方案,请告诉我!
public class WindowBase : Window
{
private bool hasFadeCompleted = false;
protected override void OnClosing(CancelEventArgs e)
{
if (this.hasFadeCompleted)
{
base.OnClosing(e);
return;
}
e.Cancel = true;
var hWnd = new WindowInteropHelper(this).Handle;
User32.AnimateWindow(hWnd, 1, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE);
Task.Factory.StartNew(() =>
{
this.Dispatcher.Invoke(new Action(() =>
{
this.hasFadeCompleted = true;
this.Close();
}), DispatcherPriority.Normal);
});
}
}
public static class User32
{
[DllImport("user32.dll")]
public static extern bool AnimateWindow(IntPtr hWnd, int time, uint flags);
}
public static class AnimateWindowFlags
{
public const uint AW_HOR_POSITIVE = 0x00000001;
public const uint AW_HOR_NEGATIVE = 0x00000002;
public const uint AW_VER_POSITIVE = 0x00000004;
public const uint AW_VER_NEGATIVE = 0x00000008;
public const uint AW_CENTER = 0x00000010;
public const uint AW_HIDE = 0x00010000;
public const uint AW_ACTIVATE = 0x00020000;
public const uint AW_SLIDE = 0x00040000;
public const uint AW_BLEND = 0x00080000;
}
我仍然感到惊讶的是,这对其他人来说都不是一个问题。