C# 隐藏窗口后对其设置动画

C# 隐藏窗口后对其设置动画,c#,wpf,C#,Wpf,我试图创建在打开/关闭时设置动画的窗口。到目前为止,我已经成功了,在So社区的帮助下,我提出了使用附加行为的解决方案 要设置窗口的动画,请执行以下操作: public class NotificationWindowBehavior : Behavior<Window> { //Here I define some properties, which I have omitted for simplicity protected override void OnAtta

我试图创建在打开/关闭时设置动画的窗口。到目前为止,我已经成功了,在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();
        }
    }
}
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的知识仅限于一个特定的windows服务。
正如前面所说的,这种方法是有效的,但我认为它闻起来很难闻,并且很想知道是否有可能重用xaml中已经定义的故事板,以便在窗口从隐藏状态打开时可以使用它。或者是否有完全不同的方法解决此问题?

从当前调用
\u propertiesWindow.Show()
?@mm8的位置调用它是从WindowsService中的方法调用的。此服务被注入某些需要打开/关闭不同窗口的viewModels中。您是否尝试在行为中处理该窗口的
IsVisibleChanged
事件?你的问题应该是将创建动画的代码移动到一个可以重用的中心位置,对吗?@mm8-Hmm,我会试试!嗯,是的,我有重复的代码做同样的事情-我喜欢附加行为的想法,因为这样我可以将动画移动到xaml,但是如果我仍然必须在我的WindowsService中保留一些代码,我最好将所有代码放在那里,忘记附加行为。这样我就可以把所有的逻辑放在一个地方。
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();