隐藏后的动画窗口

时间:2021-04-06 14:39:49

标签: c# wpf

我正在尝试创建在打开/关闭时具有动画效果的窗口。到目前为止,我已经成功并在 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 中定义的故事板,以便在从隐藏状态打开窗口时可以使用它。或者是否可以有完全不同的方法来解决这个问题?

0 个答案:

没有答案