WPF跑GIF文件的方法

简介: 注:本工程来codeproject WPF默认的IMAGE是无法让GIF文件动起来的。 下面为一种可以让GIF在WPF中动起来的办法。 关键还在AnimatedGIFControl.cs文件中。

注:本工程来codeproject

WPF默认的IMAGE是无法让GIF文件动起来的。

下面为一种可以让GIF在WPF中动起来的办法。

关键还在AnimatedGIFControl.cs文件中。

image

  1. /****************************** Module Header ******************************\
  2. Module Name:    AnimatedGIFControl.cs
  3. Project:     CSWPFAnimatedGIF
  4. Copyright (c) Microsoft Corporation.

  5. The CSWPFAnimatedGIF demonstrates how to implement
  6. an animated GIF image in WPF.

  7. This source is subject to the Microsoft Public License.
  8. See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
  9. All other rights reserved.

  10. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
  11. EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  12. WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
  13. \***************************************************************************/

  14. using System;
  15. using System.Drawing;
  16. using System.Runtime.InteropServices;
  17. using System.Windows;
  18. using System.Windows.Interop;
  19. using System.Windows.Media.Imaging;
  20. using System.Windows.Threading;

  21. namespace CSWPFAnimatedGIF
  22. {
  23.     public class AnimatedGIFControl : System.Windows.Controls.Image
  24.     {
  25.         private Bitmap _bitmap; // Local bitmap member to cache image resource
  26.         private BitmapSource _bitmapSource;
  27.         public delegate void FrameUpdatedEventHandler();
  28.             

  29.         ///
  30.         /// Delete local bitmap resource
  31.         /// Reference: http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx
  32.         ///
  33.         [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  34.         static extern bool DeleteObject(IntPtr hObject);

  35.         ///
  36.         /// Override the OnInitialized method
  37.         ///
  38.         protected override void OnInitialized(EventArgs e)
  39.         {
  40.             base.OnInitialized(e);
  41.             this.Loaded += new RoutedEventHandler(AnimatedGIFControl_Loaded);
  42.             this.Unloaded += new RoutedEventHandler(AnimatedGIFControl_Unloaded);
  43.         }

  44.         ///
  45.         /// Load the embedded image for the Image.Source
  46.         ///
  47.         void AnimatedGIFControl_Loaded(object sender, RoutedEventArgs e)
  48.         {
  49.             // Get GIF image from Resources
  50.             if (Properties.Resources.ProgressIndicator != null)
  51.             {
  52.                 _bitmap = Properties.Resources.ProgressIndicator;
  53.                 Width = _bitmap.Width;
  54.                 Height = _bitmap.Height;

  55.                 _bitmapSource = GetBitmapSource();
  56.                 Source = _bitmapSource;
  57.             }
  58.         }

  59.         ///
  60.         /// Close the FileStream to unlock the GIF file
  61.         ///
  62.         private void AnimatedGIFControl_Unloaded(object sender, RoutedEventArgs e)
  63.         {
  64.             StopAnimate();
  65.         }

  66.         ///
  67.         /// Start animation
  68.         ///
  69.         public void StartAnimate()
  70.         {
  71.             ImageAnimator.Animate(_bitmap, OnFrameChanged);
  72.         }

  73.         ///
  74.         /// Stop animation
  75.         ///
  76.         public void StopAnimate()
  77.         {
  78.             ImageAnimator.StopAnimate(_bitmap, OnFrameChanged);
  79.         }

  80.         ///
  81.         /// Event handler for the frame changed
  82.         ///
  83.         private void OnFrameChanged(object sender, EventArgs e)
  84.         {
  85.             Dispatcher.BeginInvoke(DispatcherPriority.Normal,
  86.                                    new FrameUpdatedEventHandler(FrameUpdatedCallback));
  87.         }

  88.         private void FrameUpdatedCallback()
  89.         {
  90.             ImageAnimator.UpdateFrames();

  91.             if (_bitmapSource != null)
  92.                 _bitmapSource.Freeze();

  93.             // Convert the bitmap to BitmapSource that can be display in WPF Visual Tree
  94.             _bitmapSource = GetBitmapSource();
  95.             Source = _bitmapSource;
  96.             InvalidateVisual();
  97.         }

  98.         private BitmapSource GetBitmapSource()
  99.         {
  100.             IntPtr handle = IntPtr.Zero;

  101.             try
  102.             {
  103.                 handle = _bitmap.GetHbitmap();
  104.                 _bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(
  105.                     handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  106.             }
  107.             finally
  108.             {
  109.                 if (handle != IntPtr.Zero)
  110.                     DeleteObject(handle);
  111.             }

  112.             return _bitmapSource;
  113.         }

  114.     }
  115. }


测试工程代码:
img_e25d4fb2f8de1caf41a735ec53088516.pngShow GIF animation in WPF (CSWPFAnimatedGIF).rar

相关文章
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
1232 0
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
816 0
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
304 0
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
|
C# Windows
WPF的WindowsFormsHost上浮动控件方法
如何在WPF的WindowsFormsHost实现浮动控件
594 0
|
C#
WPF获取窗口句柄的方法
原文:WPF获取窗口句柄的方法 通过WPF的互操作帮助类WindowInteropHelper,相关连接:https://msdn.microsoft.com/zh-cn/library/system.
1890 0
|
C# Windows
WPF显示GIF图的几种方式
原文:WPF显示GIF图的几种方式 使用MediaElement   这种方式有一个局限就是图片路径必须是绝对路径   并且你还需要设置让他循环播放 private void MediaElement_MediaEnded(object sender, R...
3656 0
|
C#
WPF中TextBox文件拖放问题
原文:WPF中TextBox文件拖放问题 在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功)。造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox Drag/Drop in WPF,本文只是介绍如何解决这一问题。
1147 0
|
文字识别 C++
WPF4.0用tablet实现手写输入(更新XP SP3下也能手写输入方法)
原文:WPF4.0用tablet实现手写输入(更新XP SP3下也能手写输入方法)     由于项目需求一个手写输入的控件,纠结了2天,终于搞定了。   主要是由于本人的英语不过关,一直和ocr混淆在一起,研究了Tesseract-OCR,我说奇怪了号称老牌OCR新版本还支持中文,怎么效果这么差,必须写个标准楷体才能够识别...||-_-.。
1385 0
|
C# 存储
WPF中在XAML中实现数据类型转换的两种方法
原文:WPF中在XAML中实现数据类型转换的两种方法 熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在UI界面上,比如你用bool类型存储了一个人的性别,但是在界面上却需要经过转化后显示为男或女; 今天又把数据绑定部分又看了一下,在这里就算是做个总...
1337 0