如何在更新时播放此WPF .gif文件?

时间:2011-04-22 23:26:45

标签: c# wpf xaml binding animated-gif

问题:

  • 为什么.gif加载,但在使用GifSourcePropertyChanged进行更新时无法播放?

关于.gif loading:
目前,我使用U.IsValidURL()new Uri无法投放Exception。这是因为我需要GifImage加载应用程序,然后从ViewModel更新。在GifSourcePropertyChanged被调用之前一切正常,然后更新local:GifImage,但.gif不会播放(我相信它会加载MediaElement并行加载{{1在local:GifImage加载的地方变成黑色。如果我从头开始对.gif进行硬编码,Uri加载并播放就好了。

示例XAML:

local:GifImage

示例ViewModel:

<local:GifImage 
        GifSource="{    
            Binding Path=myGifImage, 
            UpdateSourceTrigger=PropertyChanged, 
            Mode=OneWay}"
        AutoStart="True"/>

示例GifImage类:

public class ViewModel: INotifyPropertyChanged
{                   
    private string _myGifImage; 

    public string myGifImage
    {
        get { return this._myGifImage; }
        set
        {
            this._myGifImage = value;
            this.OnPropertyChanged("myGifImage");
        }
    }
}

我从某个地方得到了public class GifImage : Image { #region Memmbers private GifBitmapDecoder _gifDecoder; private Int32Animation _animation; private bool _isInitialized; #endregion Memmbers #region Properties private int FrameIndex { get { return (int)GetValue(FrameIndexProperty); } set { SetValue(FrameIndexProperty, value); } } private static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex))); private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev) { GifImage image = obj as GifImage; image.Source = image._gifDecoder.Frames[(int)ev.NewValue]; } /// <summary> /// Defines whether the animation starts on it's own /// </summary> public bool AutoStart { get { return (bool)GetValue(AutoStartProperty); } set { SetValue(AutoStartProperty, value); } } public static readonly DependencyProperty AutoStartProperty = DependencyProperty.Register("AutoStart", typeof(bool), typeof(GifImage), new UIPropertyMetadata(false, AutoStartPropertyChanged)); private static void AutoStartPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) (sender as GifImage).StartAnimation(); } public string GifSource { get { return (string)GetValue(GifSourceProperty); } set { SetValue(GifSourceProperty, value); } } public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(string.Empty, GifSourcePropertyChanged)); private static void GifSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { // CARLO 20100622: Reinitialize animation everytime image is changed (sender as GifImage).Initialize(); } #endregion Properties #region Private Instance Methods private void Initialize() { if (U.IsValidURL(this.GifSource, UriKind.Absolute)) { _gifDecoder = new GifBitmapDecoder( new Uri(this.GifSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); _animation = new Int32Animation(0, _gifDecoder.Frames.Count - 1, new Duration(new TimeSpan(0, 0, 0, _gifDecoder.Frames.Count / 10, (int)((_gifDecoder.Frames.Count / 10.0 - _gifDecoder.Frames.Count / 10) * 1000)))); _animation.RepeatBehavior = RepeatBehavior.Forever; this.Source = _gifDecoder.Frames[0]; _isInitialized = true; } } #endregion Private Instance Methods #region Public Instance Methods /// <summary> /// Shows and starts the gif animation /// </summary> public void Show() { this.Visibility = Visibility.Visible; this.StartAnimation(); } /// <summary> /// Hides and stops the gif animation /// </summary> public void Hide() { this.Visibility = Visibility.Collapsed; this.StopAnimation(); } /// <summary> /// Starts the animation /// </summary> public void StartAnimation() { if (!_isInitialized) this.Initialize(); BeginAnimation(FrameIndexProperty, _animation); } /// <summary> /// Stops the animation /// </summary> public void StopAnimation() { BeginAnimation(FrameIndexProperty, null); } #endregion Public Instance Methods } (我不记得哪个问题,GifImageWPF上有几个问题。 .gifs是唯一一个没有大量错误的课程(至少对我而言)。

1 个答案:

答案 0 :(得分:2)

不确定您的代码有什么问题,但您可以尝试使用this attached property代替:

<Image my:ImageBehavior.AnimatedSource="{Binding Path=myGifImage}"/>