How do I get an animated gif to work in WPF?

前端 未结 18 1198
广开言路
广开言路 2020-11-22 12:16

What control type should I use - Image, MediaElement, etc.?

18条回答
  •  广开言路
    2020-11-22 12:30

    Previously, I faced a similar problem, I needed to play .gif file in your project. I had two choices:

    • using PictureBox from WinForms

    • using a third-party library, such as WPFAnimatedGif from codeplex.com.

    Version with PictureBox did not work for me, and the project could not use external libraries for it. So I made it for myself through Bitmap with help ImageAnimator. Because, standard BitmapImage does not support playback of .gif files.

    Full example:

    XAML

    
    
        
            
        
    
    

    Code behind

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        Bitmap _bitmap;
        BitmapSource _source;
    
        private BitmapSource GetSource()
        {
            if (_bitmap == null)
            {
                string path = Directory.GetCurrentDirectory();
    
                // Check the path to the .gif file
                _bitmap = new Bitmap(path + @"\anim.gif");
            }
    
            IntPtr handle = IntPtr.Zero;
            handle = _bitmap.GetHbitmap();
    
            return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _source = GetSource();
            SampleImage.Source = _source;
            ImageAnimator.Animate(_bitmap, OnFrameChanged);
        }
    
        private void FrameUpdatedCallback()
        {
            ImageAnimator.UpdateFrames();
    
            if (_source != null)
            {
                _source.Freeze();
            }
    
            _source = GetSource();
    
            SampleImage.Source = _source;
            InvalidateVisual();
        }
    
        private void OnFrameChanged(object sender, EventArgs e)
        {
            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(FrameUpdatedCallback));
        }
    }
    

    Bitmap does not support URI directive, so I load .gif file from the current directory.

提交回复
热议问题