在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窗口,这是一个很容易修复的问题吗?

编辑:好的,所以我注意到了一些非常有趣的事情。当要关闭的窗口在父窗口上而不是(例如,它被移动到另一个监视器)并关闭时,通常的淡入淡出会正确启动!但是,如果要关闭的窗口位于父窗口之上,则不会发生淡入淡出。美丽的

在Vista/Windows 7上关闭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;
}

我仍然感到惊讶的是,这对其他人来说都不是一个问题。