在Vista / Windows 7上关闭时,WPF窗口不会褪色

时间:2011-06-28 19:04:53

标签: c# .net wpf gdi

我正在编写一个GDI和WPF的示例应用程序。我有一个WPF窗口,其中有一个带有点击处理程序的按钮,其中包含以下正文:

this.DialogResult = true;

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

理想情况下,我希望两种类型的窗口都以相同的风格关闭。有人遇到过这种情况么?对于我的WPF窗口的所有,这是否很容易修复?

编辑:好的,所以我发现了一些非常有趣的东西。当要关闭的窗口超过父窗口(例如,它移动到另一台显示器)并关闭时,通常的淡入淡出正确!但是,如果要关闭的窗口超过父窗口,则不会出现淡入淡出。可爱!

2 个答案:

答案 0 :(得分:0)

如果您的窗口没有边框,

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

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

答案 1 :(得分:0)

我已经提出了一个解决方案,虽然我认为它仍然相当实际上已经淡出工作的黑客。我还使用纯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;
}

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