Окно WPF не исчезает при закрытии в Vista/Windows 7

Я пишу пример приложения, которое является одновременно GDI и WPF. У меня есть окно WPF, в котором есть кнопка с обработчиком кликов со следующим телом:

this.DialogResult = true;

Это закрывает диалоговое окно WPF, как и должно быть. Однако при закрытии этого диалогового окна в Windows 7/Vista эффект «затухания» отсутствует. В качестве альтернативы, используя окно GDI, затухание работает. Я либо делаю что-то не так, либо это поведение по умолчанию при закрытии окон WPF. Кроме того, использование кнопки X для закрытия приводит к такому же нежелательному поведению.

В идеале я бы хотел, чтобы оба типа окон закрывались в одном стиле. кто-нибудь еще сталкивался с этим? Легко ли это исправить для всех моих окон WPF?

EDIT: Итак, я заметил кое-что очень интересное. Когда закрывающееся окно не находится над родительским окном (например, оно перемещено на другой монитор) и закрыто, обычное затухание срабатывает правильно! Однако, если окно, которое нужно закрыть, находится над родительским окном, исчезновение не происходит. Прекрасный!


person TheCloudlessSky    schedule 28.06.2011    source источник


Ответы (2)


Если ваше окно без рамок,

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

вы, вероятно, можете уйти, сделав анимацию затухания прозрачной, и написать обработчик события закрытия, который вызывает анимацию, а затем завершает закрытие. Если у окна есть граница, я почти уверен, что граница останется там и будет выглядеть странно.

person CodeWarrior    schedule 28.06.2011
comment
Спасибо за ваш вклад. Однако окно не безгранично. Это просто стандартное окно с одной границей. Если вы создаете новое новое приложение WPF, такое же поведение для вас? - person TheCloudlessSky; 29.06.2011
comment
Ну, класс окна по умолчанию использует эту стандартную границу, так что да. Но у меня есть несколько приложений и окон, которые я сделал без полей. В частности, моя Справка›О окнах. Мне нравится делать их без полей и непрямоугольными. Если у меня будет время позже сегодня, я могу попробовать анимировать один из них. Прямо сейчас они просто исчезают, как обычно, при закрытии. - person CodeWarrior; 29.06.2011
comment
См. мой обновленный OP для получения более подробной информации о проблеме. Если у вас есть время, попробуйте воспроизвести проблему. Я оценил вашу проницательность! - person TheCloudlessSky; 29.06.2011

Я придумал решение, хотя я думаю, что это по-прежнему вполне хак, чтобы на самом деле работало затухание. Я также тестировал чистое приложение 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;
}

Я все еще удивлен, что это не было проблемой ни для кого другого.

person TheCloudlessSky    schedule 29.06.2011