我正在尝试创建在打开/关闭时具有动画效果的窗口。到目前为止,我已经成功并在 SO 社区的帮助下提出了使用附加行为的解决方案 像这样为我的窗口设置动画:
public class NotificationWindowBehavior : Behavior<Window>
{
//Here I define some properties, which I have omitted for simplicity
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.Loaded += this.OnLoaded;
this.AssociatedObject.Closing += this.OnClosing;
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.Loaded -= this.OnLoaded;
this.AssociatedObject.Closing -= this.OnClosing;
}
private void OnLoaded(object sender, System.Windows.RoutedEventArgs e)
{
FadeInAnimation.Begin(AssociatedObject);
}
private void OnClosing(object sender, CancelEventArgs e)
{
e.Cancel = true;
FadeOutAnimation.Completed += eventHandler;
FadeOutAnimation.Begin(AssociatedObject);
void eventHandler(object s, EventArgs er)
{
FadeOutAnimation.Completed -= eventHandler;
this.AssociatedObject.Hide();
}
}
}
在 xaml 中:
<Window.Resources>
<Storyboard x:Key="FadeInAnimation">
<DoubleAnimation
Storyboard.Target="{Binding ElementName=Window}"
Storyboard.TargetProperty="(Window.Opacity)"
Duration="0:0:0.3" From="0" To="1">
</DoubleAnimation>
</Storyboard>
<Storyboard x:Key="FadeOutAnimation">
<DoubleAnimation
Storyboard.Target="{Binding ElementName=Window}"
Storyboard.TargetProperty="(Window.Opacity)"
Duration="0:0:0.3" From="1" To="0">
</DoubleAnimation>
</Storyboard>
</Window.Resources>
<i:Interaction.Behaviors>
<Behaviors:NotificationWindowBehavior
FadeInAnimation="{StaticResource FadeInAnimation}"
FadeOutAnimation ="{StaticResource FadeOutAnimation}"
</Behaviors:NotificationWindowBehavior>
</i:Interaction.Behaviors>
这很好用,但是如果我想将此窗口创建为仅隐藏而不关闭的可重用窗口,问题是动画仅在第一次创建窗口时才起作用。所以我提出的当前“解决方案”是检查某种 windowService 如果窗口被隐藏,然后简单地重新创建这样的动画:
if(_propertiesWindow.Visibility == Visibility.Hidden)
{
var fadeInAnimation = new DoubleAnimation(1, new Duration(new TimeSpan(0, 0, 0, 0, 290)));
Storyboard.SetTarget(fadeInAnimation, _propertiesWindow);
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(Window.OpacityProperty));
var fadeInStoryBoard = new Storyboard();
fadeInStoryBoard.Children.Add(fadeInAnimation);
fadeInStoryBoard.Begin();
}
_propertiesWindow.Show();
我正在尝试使用 MVVM 方法并避免代码隐藏/将有关 Windows 的知识仅限于一个特定的 windowService。 如前所述,这种方法有效,但我认为它有味道并且想听听是否有可能以某种方式重用已在 xaml 中定义的故事板,以便在从隐藏状态打开窗口时可以使用它。或者是否可以有完全不同的方法来解决这个问题?