wpf gif
От: Аноним  
Дата: 11.09.09 09:33
Оценка:
вообще вот такая проблема

пишу wpf приложение. я не нашел компонента, который правильно отображает gif анимацию, поэтому использую PictureBox.

<wfi:WindowsFormsHost Height="93">
  <winForms:PictureBox x:Name="pictureBoxLoading">

  </winForms:PictureBox>
</wfi:WindowsFormsHost>


в проекте находится папка с изображениями — у все свойства Resources установлены
на относительный путь ругается:

    pictureBoxLoading.Image = Bitmap.FromFile("right.gjf"); - FileNotExisted


так вот я не знаю как загрузить pictureBoxLoading.Image, так как нету поддержки конструкции Uri(pack:///)....

подскажите как загрузить правильно?
wpf gif picturebox
Re: wpf gif
От: anton_t Россия  
Дата: 11.09.09 11:03
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>вообще вот такая проблема


А>пишу wpf приложение. я не нашел компонента, который правильно отображает gif анимацию, поэтому использую PictureBox.


А>
А><wfi:WindowsFormsHost Height="93">
А>  <winForms:PictureBox x:Name="pictureBoxLoading">

А>  </winForms:PictureBox>
А></wfi:WindowsFormsHost>
А>


А>в проекте находится папка с изображениями — у все свойства Resources установлены

А>на относительный путь ругается:

А>
А>    pictureBoxLoading.Image = Bitmap.FromFile("right.gjf"); - FileNotExisted
А>


А>так вот я не знаю как загрузить pictureBoxLoading.Image, так как нету поддержки конструкции Uri(pack:///)....


А>подскажите как загрузить правильно?


Если нужен анимированный gif, то есть такой код, найденный в инете и слегка доработанный напильником (и никаких WinForms, соответственно с "pack://..." проблем не будет):

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

namespace Images
{
    /// <summary>
    /// Класс для отображения анимированных GIF-ов.
    /// </summary>
    public class GifImage : 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(GifImage), new UIPropertyMetadata(0, ChangingFrameIndex));

        private Uri _gifSource;
        private double _framesPerSecond = 10.0;

        static void ChangingFrameIndex (DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            var ob = (GifImage) 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()
        {
            _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;
            }
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.