Мой Kbyte.Ru
Рассылка Kbyte.Ru
Группы на Kbyte.Ru
Партнеры Kbyte.Ru
Реклама
Сделано руками
Сделано руками
> Исходные коды - Интернет -

C# - Графика

Все примеры / WPF & Silverlight (WPF/E) / Мультимедиа / Графика

Gif-анимаиция в WPF

Автор: Интернет | добавлено: 13.01.2012, 16:41 | просмотров: 4869 (2+) | комментариев: 0 | рейтинг: *x2
Это небольшой класс-контрол (C#), который позволяет разместить на форме анимированный gif.

Инструкции

Могут потребоваться следующие ссылки:

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


Для использования нужно разместить элемент на форме/окне/странице:
<my:AnimatedGIFViewer GifSource="ссылка на gif" />

либо добавить его программно.

Код

public class AnimatedGIFViewer : System.Windows.Controls.Image
{
  GifBitmapDecoder _gf;
  Int32Animation _anim;
  bool _animationIsWorking = false;

  /// <summary>
  /// Индес отображаемого кадра GIF-а.
  /// </summary>
  public int FrameIndex
  {
    get { return (int)GetValue(FrameIndexProperty); }
    set { SetValue(FrameIndexProperty, value); }
  }

  /// <summary>
  /// Свойство зависимоти - индес отображаемого кадра GIF-а.
  /// </summary>
  public static readonly DependencyProperty FrameIndexProperty =
      DependencyProperty.Register("FrameIndex", typeof(int), typeof(AnimatedGIFViewer), new UIPropertyMetadata(0, ChangingFrameIndex));

  private Uri _gifSource;
  private double _framesPerSecond = 10.0;

  static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
  {
    var ob = (AnimatedGIFViewer)obj;
    ob.Source = ob._gf.Frames[(int)ev.NewValue];

    ob.InvalidateVisual();
  }

  /// <summary>
  /// Адрес отображаемого GIF-а.
  /// </summary>
  public Uri GifSource
  {
    get { return _gifSource; }
    set
    {
      _gifSource = value;
      RefreshGif();
    }
  }

  /// <summary>
  /// Скорость анимации GIF-а (кадров в секунду) 
  /// </summary>
  public double FramesPerSecond
  {
    get { return _framesPerSecond; }
    set
    {
      _framesPerSecond = value;
      RefreshGif();
    }
  }

  private void RefreshGif()
  {
    if (_gifSource == null || String.IsNullOrEmpty(_gifSource.ToString())) return;
    _gf = new GifBitmapDecoder(_gifSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    if (_gf.Frames != null)
    {
      _anim = new Int32Animation(0,
          _gf.Frames.Count - 1,
          new Duration(TimeSpan.FromSeconds(_gf.Frames.Count / FramesPerSecond)));
      _anim.RepeatBehavior = RepeatBehavior.Forever;
      Source = _gf.Frames[0];
    }
  }

  protected override void OnRender(DrawingContext dc)
  {
    base.OnRender(dc);
    if (!_animationIsWorking && _anim != null)
    {
      BeginAnimation(FrameIndexProperty, _anim);
      _animationIsWorking = true;
    }
  }
}
Об авторе

Интернет

Анонимный пользователь сети Интернет. Автор великого множества кодов и программных решений. Никого никогда не видел в лицо этого пользователя, ходят слухи, что он многоликий, и может одновременно находиться в разных частях света.
Интернет
Последние комментарии (всего: 0)

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учетная запись на Kbyte.Ru, пройдите процедуру авторизации OpenID.
Если Вы еще не зарегистрированы на Kbyte.Ru - зарегистрируйтесь.


Нет комментариев...

Авторизация
 
OpenID
Зарегистрируйся и получи 10% скидку на добавление своего сайта в каталоги! Подробнее »
Поиск по сайту
Реклама
Счетчики