更改ContentTemplate时的动画

时间:2011-09-23 14:37:06

标签: wpf animation mvvm datatemplate

我有一个窗口,随着时间的推移必须显示不同的控件。我使用mvvm模式搜索了一个解决方案,最后得到了这个

<ContentControl Content="{Binding}">
        <ContentControl.Style>
            <Style TargetType="ContentControl">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ViewType}" Value="RecipeList">
                        <Setter Property="ContentTemplate" Value="{StaticResource RecipeTemplate}"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ViewType}" Value="Default">
                        <Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
</ContentControl>

到目前为止,这项工作正常,但我对两件事感到好奇:

  1. 使用mvvm有更好的方法吗?
  2. 如何为即将展示的新datatemplate中的项目执行动画?

2 个答案:

答案 0 :(得分:1)

由于动画是特定于视图的操作,因此它们应该从视图后面的代码运行,而不是ViewModel。在过去,我已经连接到一个事件,并从代码隐藏中运行以下内容:

Storyboard animation = (Storyboard)panel.FindResource("MyAnimation");
animation.Begin();

对于问题#1,我发现您的代码没有任何问题,可以根据ViewModel中的属性显示不同的View。

答案 1 :(得分:1)

关于问题#2:

您可以在模板中的控件中使用EventTrigger来启动动画,如下所示:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard>
                    <Storyboard x:Name="SomeStoryBoard"/>
                </BeginStoryboard>
            </EventTrigger>
        </Grid.Triggers>
    </Grid>
</Window>