【问题标题】:WPF window not fading when closing on Vista/Windows 7在 Vista/Windows 7 上关闭时 WPF 窗口不消失
【发布时间】:2011-09-24 14:28:31
【问题描述】:

我正在编写一个既是 GDI 又是 WPF 的示例应用程序。我有一个 WPF 窗口,它有一个带有单击处理程序的按钮,其正文如下:

this.DialogResult = true;

这会正常关闭 WPF 对话框。但是,关闭此对话框时,Windows 7/Vista 上没有“淡入淡出”效果。或者,使用 GDI 窗口,淡入淡出工作。我要么做错了,要么这是关闭 WPF 窗口时的默认行为。此外,使用 X 按钮关闭会执行相同的不需要的行为。

理想情况下,我希望两种类型的窗口都以相同的样式关闭。有人遇到过这种情况么?对于我的 所有我的 WPF 窗口来说,这很容易解决吗?

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

【问题讨论】:

    标签: c# .net wpf gdi


    【解决方案1】:

    如果你的窗口是无边框的,

    <Window 
       xmlns="blahblahblah"
       AllowsTransparency="True" WindowStyle="None">
    

    您可以将淡入淡出动画设置为透明,然后编写一个调用动画然后完成关闭的关闭事件处理程序。如果窗口有边框,我很确定边框会留在那里并且看起来很奇怪。

    【讨论】:

    • 感谢您的意见。但是,窗口不是无边界的。它只是一个标准的单边框窗口。如果您创建新的 WPF 应用程序,这种行为对您来说是否相同?
    • 那么窗口类默认为标准边框,所以是的。但我确实有几个应用程序和窗口是无边界的。尤其是我的帮助>关于窗口。我喜欢让它们无边界和非矩形。如果我今天晚些时候有时间,我可以尝试制作一个动画。现在它们只是在关闭时像往常一样消失。
    • 查看我更新的 OP 以了解有关该问题的更多详细信息。如果您有时间,请尝试重现该问题。感谢您的洞察力!
    【解决方案2】:

    我想出了一个解决方案,虽然我认为它仍然是相当真正让淡入淡出工作的黑客。我还使用纯 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;
    }
    

    我仍然很惊讶这对其他人来说不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2010-12-06
      • 2011-01-05
      • 2011-08-04
      相关资源
      最近更新 更多