我有一个以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来实现它的工作,但这似乎是一个糟糕的设计。
答案 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);
}
}
}