2

我有这个视图模型:

public class ViewModel : ViewModelBase
{
    public ViewModel()
    {
        // indeed, images are dynamically generated
        normal = new BitmapImage(new Uri("Normal.jpg", UriKind.Relative));
        flash = new BitmapImage(new Uri("Flash.jpg", UriKind.Relative));
    }

    public bool IsFlashing
    {
        get { return isFlashing; }
        set
        {
            if (isFlashing != value)
            {
                isFlashing = value;
                OnPropertyChanged("IsFlashing");
            }
        }
    }
    private bool isFlashing;

    public ImageSource Normal
    {
        get { return normal; }
        private set
        {
            if (normal != value)
            {
                normal = value;
                OnPropertyChanged("Normal");
            }
        }
    }
    private ImageSource normal;

    public ImageSource Flash
    {
        get { return flash; }
        set
        {
            if (flash != value)
            {
                flash = value;
                OnPropertyChanged("Flash");
            }
        }
    }
    private ImageSource flash;
}

当. _ Normal_ 为了演示我想要实现的目标,我将发布一段 XAML:FlashIsFlashing == true

        <DataTemplate x:Key="MyTemplate">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition />
                </Grid.RowDefinitions>

                <CheckBox Content="Is flashing" IsChecked="{Binding IsFlashing}"/>

                <Image x:Name="MyImage" Grid.Row="1" Source="{Binding Normal}"/>
            </Grid>

            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsFlashing}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MyImage" 
                                                               Storyboard.TargetProperty="Source" 
                                                               RepeatBehavior="Forever">
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{Binding Normal}"/>
                                    <DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{Binding Flash}"/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>

这不起作用,因为动画引擎无法使用绑定冻结情节提要。有没有其他方法可以实现这一目标?

我可以在视图模型中使用计时器来解决这个问题……但是这种方法很臭。

更新 根据 Richard Deeming 的回答,数据模板看起来是这样的。它有效,而且绝对比计时器更好:

        <DataTemplate x:Key="MyTemplate">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition />
                </Grid.RowDefinitions>

                <CheckBox Content="Is flashing" IsChecked="{Binding IsFlashing}"/>

                <Image x:Name="NormalImage" Grid.Row="1" Source="{Binding Normal}"/>
                <Image x:Name="FlashImage" Grid.Row="1" Source="{Binding Flash}" Visibility="Collapsed"/>
            </Grid>

            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsFlashing}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalImage" 
                                                               Storyboard.TargetProperty="Visibility" 
                                                               RepeatBehavior="Forever"
                                                               Duration="0:0:1">
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Collapsed}"/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FlashImage" 
                                                               Storyboard.TargetProperty="Visibility" 
                                                               RepeatBehavior="Forever"
                                                               Duration="0:0:1">
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"/>
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Visible}"/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard FillBehavior="Stop">
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalImage" 
                                                               Storyboard.TargetProperty="Visibility"
                                                               Duration="0:0:1">
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                        <BeginStoryboard>
                            <Storyboard FillBehavior="Stop">
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FlashImage" 
                                                               Storyboard.TargetProperty="Visibility"
                                                               Duration="0:0:1">
                                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"/>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
4

1 回答 1

2

最简单的解决方案可能是有两个重叠的图像 - 一个绑定到Normal源,一个绑定到Flash源。然后,您可以使用为两个图像上Storyboard的属性设置动画。Visibility

于 2013-07-26T18:09:29.637 回答