2010-05-07 116 views
0

我使用的是想在我的应用程序来实现MVVM。我有一个MainWindow.xaml和一个MainWindowViewModel。我正在从MainWindow.xaml中删除所有代码隐藏代码,但我被困在最后一块。WPF MVVM触发动画在主窗口关闭

在我的预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> 

不知怎的,(插入魔术在这里)我要设置CloseWindow在虚拟机上,通过结合,为True当动画完成,然后使用AttachedBehavior关闭窗口。该AttachedBehavior完美的作品时,我只设置CloseWindow直接使用下面的XAML:

<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,因为我的虚拟机不是从UIElement下载的,而且我一直在Google上搜索,试图提出一种聪明的,MVVM友好的方式来做到这一点,但没有运气。

因此,任何想法,为什么该动画不会做任何事情?更重要的是,你如何解决动画表单动画缩短虚拟机的整个问题?我不怀疑我对这个问题的整个解决方案可能会受到打击,所以我对任何事情都是开放的。

回答

0

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

为什么不是简单的booleanAnimation,将在两秒钟后启动,并设置AB补充:WindowCloseBehavior.Close”值设置为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> 

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