2011-04-06 4 views
1

Voici un morceau de code que je trouve ici: How do I get an animated gif to work in WPF?Get GIF à jouer dans WPF (avec GifImage classe)

class GifImage : Image { 

    public int FrameIndex { 
     get { return (int)GetValue(FrameIndexProperty); } 
     set { SetValue(FrameIndexProperty, value); } 
    } 

    public static readonly DependencyProperty FrameIndexProperty = 
     DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex))); 

    static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev) { 
     GifImage ob = obj as GifImage; 
     ob.Source = ob.gf.Frames[(int)ev.NewValue]; 
     ob.InvalidateVisual(); 
    } 
    GifBitmapDecoder gf; 
    Int32Animation anim ;    
    public GifImage(Uri uri) { 
     gf = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
     anim = new Int32Animation(0, gf.Frames.Count - 1, new Duration(new TimeSpan(0,0, 0,gf.Frames.Count/10,(int)((gf.Frames.Count/10.0-gf.Frames.Count/10)*1000)))); 
     anim.RepeatBehavior = RepeatBehavior.Forever; 
     Source = gf.Frames[0]; 
    } 
    bool animationIsWorking = false; 
    protected override void OnRender(DrawingContext dc) { 
     base.OnRender(dc); 
     if (!animationIsWorking) { 
      BeginAnimation(FrameIndexProperty, anim); 
      animationIsWorking = true; 
     } 
    } 
} 

Il devait me permettre d'utiliser GifImage comme témoin. Mais

  1. Comment l'utiliser en XAML?
  2. Comment définir la source? J'ai essayé diverses combinaisons, mais ne fonctionne pas et il n'y a aucune documentation:

GifImage gifImg = new GifImage (nouveau Uri ("/ application; composant/Images/indicator.gif");

ne fonctionne pas et exception me dit un mauvais chemin mais je ne peux pas obtenir le droit chemin. Aidez ..

Répondre

4

J'ai modifié le code ci-dessus un peu et il semble fonctionner.

Xaml:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <local:GifImage GifSource="c:\data\test.gif" /> 
    </Grid> 
</Window> 

code:

using System; 
using System.Windows.Controls; 
using System.Windows; 
using System.Windows.Media.Imaging; 
using System.Windows.Media.Animation; 


namespace WpfApplication1 
{ 
    public class GifImage : Image 
    { 
     private GifBitmapDecoder _decoder; 
     private Int32Animation _animation; 

     #region FrameIndex 

     public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex))); 

     public int FrameIndex 
     { 
      get { return (int)GetValue(FrameIndexProperty); } 
      set { SetValue(FrameIndexProperty, value); } 
     } 

     private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev) 
     { 
      GifImage gifImage = obj as GifImage; 
      gifImage.ChangeFrameIndex((int)ev.NewValue); 
     } 

     private void ChangeFrameIndex(int index) 
     { 
      Source = _decoder.Frames[index]; 
     } 

     #endregion 

     #region GifSource 

     public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(String.Empty, new PropertyChangedCallback(GifSourceChanged))); 
     public string GifSource 
     { 
      get { return (string)GetValue(GifSourceProperty); } 
      set { SetValue(GifSourceProperty, value); } 
     } 

     private static void GifSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs ev) 
     { 
      GifImage gifImage = obj as GifImage; 
      gifImage.GifSourceChanged(ev.NewValue.ToString()); 
     } 

     private void GifSourceChanged(string newSource) 
     { 
      if (_animation != null) 
       BeginAnimation(FrameIndexProperty, null); 

      _decoder = new GifBitmapDecoder(new Uri(newSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
      Source = _decoder.Frames[0]; 

      int count = _decoder.Frames.Count; 
      _animation = new Int32Animation(0, count - 1, new Duration(new TimeSpan(0, 0, 0, count/10, (int)((count/10.0 - count/10) * 1000)))); 
      _animation.RepeatBehavior = RepeatBehavior.Forever; 
      BeginAnimation(FrameIndexProperty, _animation); 
     } 

     #endregion 
    } 
} 
+0

Pourquoi utilisez-vous '10' dans cette partie du code:' compter/10, (int) ((compte/10.0 - compter/10) * 1000) '? – vasylysk