* STYLE *故事板完成后关闭窗口

时间:2017-09-22 23:12:31

标签: c# wpf

我有一个以Window为目标的Style,我做一些基本的淡入/淡出和Stop / Seek通过故事板,Window表现我想要的方式。然后我注意到窗口实际上并未在淡出时关闭。风格的相关部分是:

    <Style.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard Name="sbFadeInFadeOut">
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:01" From="0.0" To="0.8" />
                    <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:01.5" From="0.8" To="0.0" BeginTime="00:00:04" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>

所以我在窗口淡出然后过了一会儿我淡出了它。还有其他一些场景,我希望这个动画可以去,有些地方我只想在窗户附近平整。

无论如何,在这个故事板的末尾,不透明度为0,但窗口实际上仍然是打开的。

我尝试将第二个动画的已完成事件设置为&#34;关闭&#34;,但得到了:

活动&#39;已完成&#39;无法在Style中的Target标记上指定。请改用EventSetter。第225行第123位。

我通过向Opacity DP添加一个回调并等待它为0来实现它的工作,但这似乎是一个糟糕的设计。

1 个答案:

答案 0 :(得分:0)

可以通过创建附加属性来完成一个可能的解决方案,该附加属性在Window的最后true更改为StoryBoard后关闭Animation:< / p>

<Style.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard Name="sbFadeInFadeOut">
            <Storyboard>
                <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:01" From="0.0" To="0.8" />
                <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:01.5" From="0.8" To="0.0" BeginTime="00:00:04" />
                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(local:WindowAttachedProperties.IsClosed)" BeginTime="00:00:05.5">
                    <DiscreteBooleanKeyFrame Value="True" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Style.Triggers>

附加属性定义为:

using System.Windows;

namespace MyApplication.AttachedProperties
{
    public class WindowAttachedProperties
    {
        public static readonly DependencyProperty IsClosedProperty = DependencyProperty.RegisterAttached(
            "IsClosed", typeof(bool), typeof(WindowAttachedProperties), new PropertyMetadata(default(bool), PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var window = dependencyObject as Window;
            var isClosed = window?.GetValue(IsClosedProperty) as bool?;

            if (window != null && isClosed.GetValueOrDefault())
            {
                window.Close();
            }
        }

        public static void SetIsClosed(DependencyObject element, bool value)
        {
            element.SetValue(IsClosedProperty, value);
        }

        public static bool GetIsClosed(DependencyObject element)
        {
            return (bool) element.GetValue(IsClosedProperty);
        }
    }
}