MainWindow上的WPF MVVM触发器动画关闭

时间:2010-05-07 23:00:52

标签: wpf animation mvvm triggers

我正在尝试在我的应用中实现MVVM。我有一个MainWindow.xaml和一个MainWindowViewModel。我正在从MainWindow.xaml中删除所有代码隐藏代码,但我仍然坚持最后一块。

在我的MVVM前设置中,我在MainWindow.xaml.cs中启动了一个动画,它会在关闭之前淡出表单。由于Closing不是RoutedEvent,我不得不使用代码隐藏来实现这一点。

我的VM具有以下两个可绑定的属性:ClosingWindow和CloseWindow。我的目标是将MainWindowStyle中的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>

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

<DataTrigger Binding="{Binding CloseWindow}" Value="True">
    <Setter Property="ab:WindowCloseBehavior.Close" Value="True"/>
</DataTrigger>

...但我希望在表单实际关闭之前重现表单淡入淡出。

所以我遇到了两个问题:首先,动画不起作用。我正确地输入了触发器(我已经取出动画并在其中放置一个Setter语句,将MainWindow的标题更改为“Closing”,并且当ClosingWindow = True时它会正确更改)但DoubleAnimation从不做任何事情。其次,动画完成后无法设置CloseWindow的值。我查看了Marlon Grech的animation code,但这对DataTriggers无效。我无法发布RoutedEvent,因为我的VM并没有从UIElement下载,而且我整天都在谷歌搜索试图想出一个聪明,MVVM友好的方式来做到这一点,没有运气。

那么为什么动画不做任何事情的想法呢?更重要的是,你如何解决从VM关闭动画表格淡化的整个问题?我不怀疑我对这个问题的整个解决方案可能会受到打击,因此我对任何事情都持开放态度。

1 个答案:

答案 0 :(得分:0)

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

为什么不简单地添加一个将在两秒后启动的booleanAnimation并设置ab:WindowCloseBehavior.Close“Value to 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>

同样,我不是专家,只是一个想法。