WPF:无法在动画中绑定位图源

时间:2016-09-23 08:55:14

标签: c# wpf xaml binding

我有一个简单的动画,可以交替改变图像的两个帧。它完美无缺,直到我尝试绑定bitmapimage urisource。

<Image Stretch="Fill">
<Image.Triggers>
    <EventTrigger RoutedEvent="Image.Loaded">
        <BeginStoryboard>
            <Storyboard RepeatBehavior="Forever">
                <ObjectAnimationUsingKeyFrames  
                    BeginTime="00:00:00" Duration="{Binding ElementName=MyControl, Path=FrameDuration}" 
                    Storyboard.TargetProperty="(Image.Source)">
                    <DiscreteObjectKeyFrame KeyTime="00:00:00.000000">
                        <DiscreteObjectKeyFrame.Value>
                            <BitmapImage UriSource="Assets/frame1.png" />
                        </DiscreteObjectKeyFrame.Value>
                    </DiscreteObjectKeyFrame>
                </ObjectAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames  
                    BeginTime="{Binding ElementName=MyControl, Path=FrameBeginTime}" Duration="{Binding ElementName=MyControl, Path=FrameDuration}"
                    Storyboard.TargetProperty="(Image.Source)">
                    <DiscreteObjectKeyFrame KeyTime="00:00:00.0000000">
                        <DiscreteObjectKeyFrame.Value>
                            <BitmapImage UriSource="Assets/frame2.png" />
                        </DiscreteObjectKeyFrame.Value>
                    </DiscreteObjectKeyFrame>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Image.Triggers>

我尝试了这两个绑定但没有一个工作:

XAML:

<BitmapImage Source="{Binding ElementName=MyControl, Path=FrameUri1}"  />

代码:

public Uri FrameUri1 { get { return _frameUri1; } set { _frameUri1 = value; NotifyPropertyChanged("FrameUri1"); } }

XAML:

<Image Source="{Binding ElementName=CosoControl, Path=BitmapSource}"  />

代码:

public ImageSource BitmapSource
    {
        get
        {
            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri("pack://application:,,,/Myassembly;component/Assets/frame1.png");
            bitmap.EndInit();
            return bitmap;
        }
    }

我读过其他类似问题的帖子,但我对WPF / C#很新,我无法弄清楚如何解决它。我读到了IValueConverter,但不知道如何安排。

1 个答案:

答案 0 :(得分:0)

最好的办法是使用差异。具有适当绑定的图像并隐藏它们。然后为所需的不透明度/可见性设置动画。

<Border BorderThickness="3" BorderBrush="#FF341A1A" Height="200">            
        <Border.Background>
        <VisualBrush>
            <VisualBrush.Visual>
                <Grid>
                    <Image x:Name="Img1" Visibility="Collapsed" Source="{Binding Text, ElementName=MyControl1}"/>
                    <Image x:Name="Img2" Visibility="Collapsed" Source="{Binding Text, ElementName=MyControl2}"/>
                </Grid>
            </VisualBrush.Visual>
        </VisualBrush>
    </Border.Background>
    <Border.Triggers>
        <EventTrigger RoutedEvent="Border.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames 
                                Duration="0:0:3"
                                Storyboard.TargetName="Img1"
                                Storyboard.TargetProperty="Visibility"
                                >
                        <DiscreteObjectKeyFrame KeyTime="0:0:1">
                            <DiscreteObjectKeyFrame.Value>
                                <Visibility>Visible</Visibility>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>                                
                    </ObjectAnimationUsingKeyFrames>                            
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Border.Triggers>
</Border>