2013-10-30 7 views
11

ich für gif Animieren in seprate Bibliothek diesen Code verwenden und XAML-Code in meinem Hauptprojekt:Animieren Gif in WPF

<controls:GifImage GifSource="/project;component/Images/my.gif" Stretch="None" /> 

Gif Animieren (seprate-Datei):

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() 
     { 

      _gifDecoder = new GifBitmapDecoder(new Uri(String.Format("pack://application:,,,{0}", 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 
    } 

aber i Fehler erhalten:

The URI prefix is not recognized.

Ich bin mir nicht sicher, warum ich einen Fehler bekomme. Könnte mir bitte jemand helfen?

Antwort

23

Es gibt eine viel einfachere Möglichkeit ist ein animiertes GIF in WPF zu zeigen - die MediaElement

Beispiel verwenden:

<MediaElement x:Name="myGif" MediaEnded="myGif_MediaEnded" UnloadedBehavior="Manual"  Source="file://C:\waiting.GIF" LoadedBehavior="Play" Stretch="None"/> 

Wenn Sie das GIF-Schleife endlos wollen, aber es gibt nur eine begrenzte Menge der Wiederholungen in der GIF-Datei, können Sie MediaEnded Haken und nur die Animation neu starten (Achten Sie darauf, die UnloadedBehavior-Manual eingestellt):

private void myGif_MediaEnded(object sender, RoutedEventArgs e) 
    { 
     myGif.Position = new TimeSpan(0, 0, 1); 
     myGif.Play(); 
    } 
+1

danke, aber das ist nicht meine Frage Lösung. – UFO

+0

Wie lege ich den Speicherort der GIF-Datei auf dem Bildschirm fest? – zetar

+2

Funktioniert nicht auf Gif's größer als ein paar Kb – Wobbles

0

Versuchen Sie folgendes: warum

<controls:GifImage GifSource="/Images/my.gif" Stretch="None" /> 

BTW, ich auf diese Weise gefunden mit gif in wpf spielen könnten einige GIF-Bilder verformen, und ich frage mich ...

+0

Wo finden Sie diese Kontrolle? –

+0

Diese Lösung kann hier gefunden werden: https://Stackoverflow.com/a/1134340/2772330 –

0

Ich kann nicht Kredit für diese nehmen aber Hier ist eine Möglichkeit, dies nur in XAML zu tun. Ich habe meinem ViewModel eine "IsBusy" -Eigenschaft hinzugefügt, um den Spinner während der Verarbeitung ein-/auszublenden.

 <Image Name="Spinner" Source="Resources/spinner.gif" RenderTransformOrigin="0.5, 0.5"> 
      <Image.Triggers> 
       <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
        <EventTrigger.Actions> 
         <BeginStoryboard> 
          <Storyboard Storyboard.TargetName="Spinner" Storyboard.TargetProperty="RenderTransform.(RotateTransform.Angle)"> 
           <DoubleAnimation From="0" To="360" BeginTime="0:0:0" Duration="0:0:2" RepeatBehavior="Forever" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 
      </Image.Triggers> 
      <Image.RenderTransform> 
       <RotateTransform Angle="0" /> 
      </Image.RenderTransform> 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsBusy}" Value="False"> 
          <Setter Property="Visibility" Value="Hidden"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 

Hier ist die link zur Lösung des Autors.

+0

Dies ist nur das Bild drehen (Bilder aus dem ersten Bild, wenn die Quelle ist. Gif) –