WPF MVVM在主窗口关闭时触发动画

WPF MVVM在主窗口关闭时触发动画,wpf,animation,mvvm,triggers,Wpf,Animation,Mvvm,Triggers,我正在尝试在我的应用程序中实现MVVM。我有一个MainWindow.xaml和一个MainWindowViewModel。我正在从MainWindow.xaml中删除所有的代码隐藏代码,但最后一个问题让我束手无策 在MVVM之前的设置中,我在MainWindow.xaml.cs中启动了一个动画,该动画在关闭窗体之前会淡出窗体。因为关闭不是一个RoutedEvent,所以我不得不使用代码隐藏来实现这一点 我的VM有以下两个可以绑定的属性:ClosingWindow和CloseWindow。我的目

我正在尝试在我的应用程序中实现MVVM。我有一个MainWindow.xaml和一个MainWindowViewModel。我正在从MainWindow.xaml中删除所有的代码隐藏代码,但最后一个问题让我束手无策

在MVVM之前的设置中,我在MainWindow.xaml.cs中启动了一个动画,该动画在关闭窗体之前会淡出窗体。因为关闭不是一个RoutedEvent,所以我不得不使用代码隐藏来实现这一点

我的VM有以下两个可以绑定的属性:ClosingWindow和CloseWindow。我的目标是将MainWindowsStyle中的DataTrigger绑定到VM的ClosingWindow属性。当ClosingWindow设置为True时,它将使用以下XAML启动动画:

<DataTrigger Binding="{Binding ClosingWindow}" Value="True">                
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2"/>
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding CloseWindow}" Value="True">
    <Setter Property="ab:WindowCloseBehavior.Close" Value="True"/>
</DataTrigger>

不知何故(在这里插入魔术),当动画完成时,我打算通过绑定将VM上的CloseWindow设置为True,然后使用AttachedBehavior关闭窗口。当我直接使用以下XAML设置CloseWindow时,AttachedBehavior可以完美地工作:

<DataTrigger Binding="{Binding ClosingWindow}" Value="True">                
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2"/>
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding CloseWindow}" Value="True">
    <Setter Property="ab:WindowCloseBehavior.Close" Value="True"/>
</DataTrigger>

…但我想在窗体实际关闭之前复制窗体淡入淡出

因此,我遇到了两个问题:第一,动画不起作用。我正确地输入了触发器(我取出了动画,并在其中放置了一个Setter语句,该语句将主窗口的标题更改为“Closing”,当ClosingWindow=True时,它将正确地更改),但DoubleAnimation从不做任何事情。其次,动画完成后,无法设置CloseWindow的值。我看了Marlon Grech的,但这对数据触发器不起作用。我不能发布RouteEvent,因为我的虚拟机不是从UIElement派生的,我整天都在谷歌上搜索,试图找到一种聪明的、MVVM友好的方法来实现这一点,但运气不好


那你知道为什么那部动画什么都没做吗?更重要的是,您将如何解决在虚拟机关闭时设置窗体淡入淡出动画的整个问题?我不怀疑我对这个问题的整个解决方案可能会遭到破坏,所以我对任何事情都持开放态度

我是WPF的新手,但我有一个想法(希望这不是愚蠢的想法)

为什么不简单地添加一个两秒钟后开始的布尔动画,并将ab:WindowCloseBehavior.Close“值设置为true”true

像这样的事情:

<DataTrigger Binding="{Binding ClosingWindow}" Value="True">                
<DataTrigger.EnterActions>
    <BeginStoryboard>
        <Storyboard>
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2"/>
    <BooleanAnimationUsingKeyFrames 
            Storyboard.TargetName="myAnimatedButton" Storyboard.TargetProperty="ab:WindowCloseBehavior.Close"
            Duration="0:0:4" FillBehavior="HoldEnd">
            <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:2" />
          </BooleanAnimationUsingKeyFrames>
        </Storyboard>
    </BeginStoryboard>
</DataTrigger.EnterActions>

再说一次,我不是专家,只是一个想法