如何获得此WPF .gif以便在更新时播放?

| 题: 为什么用
GifSourcePropertyChanged
加载我的
.gif
却不能播放? 大约
.gif
装载: 目前我已经使用
U.IsValidURL()
来防止
new Uri
投掷
Exception
。这是因为我需要ѭ6才能加载应用程序,然后再从ѭ7进行更新。一切正常,直到调用
GifSourcePropertyChanged
,然后更新
local:GifImage
,但the0ѭ不播放(我相信它会随着
MediaElement
并行加载而载入,而
local:GifImage
会变黑,假设where0ѭ要加载)。如果我从一开始就对样本
Uri
进行硬编码,则
local:GifImage
会加载并正常播放。 XAML示例:
<local:GifImage 
        GifSource=\"{    
            Binding Path=myGifImage, 
            UpdateSourceTrigger=PropertyChanged, 
            Mode=OneWay}\"
        AutoStart=\"True\"/>
示例ViewModel:
public class ViewModel: INotifyPropertyChanged
{                   
    private string _myGifImage; 

    public string myGifImage
    {
        get { return this._myGifImage; }
        set
        {
            this._myGifImage = value;
            this.OnPropertyChanged(\"myGifImage\");
        }
    }
}
示例GifImage类:
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
}  
我从某处的某个地方得到了6英镑(我不记得哪个问题,在20英镑和21英镑上有几个问题)。
GifImage
是唯一没有很多错误的类(至少对我而言)。     
已邀请:
不知道您的代码是什么问题,但是您可以尝试使用此附加属性:
<Image my:ImageBehavior.AnimatedSource=\"{Binding Path=myGifImage}\"/>
    

要回复问题请先登录注册