我应该使用什么控件类型-图像,MediaElement等?


当前回答

我无法让这个问题最流行的答案(上面由达里奥提出)正常工作。结果是奇怪的、起伏不定的动画和奇怪的工件。 目前为止我找到的最佳解决方案: https://github.com/XamlAnimatedGif/WpfAnimatedGif

你可以用NuGet安装它

WpfAnimatedGif安装包

并使用它,在一个新的名称空间的窗口,你想添加gif图像,并使用它如下所示

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:gif="http://wpfanimatedgif.codeplex.com" <!-- THIS NAMESPACE -->
    Title="MainWindow" Height="350" Width="525">

<Grid>
    <!-- EXAMPLE USAGE BELOW -->
    <Image gif:ImageBehavior.AnimatedSource="Images/animated.gif" />

这个包非常简洁,你可以像下面这样设置一些属性

<Image gif:ImageBehavior.RepeatBehavior="3x"
       gif:ImageBehavior.AnimatedSource="Images/animated.gif" />

你也可以在你的代码中使用它:

var image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(fileName);
image.EndInit();
ImageBehavior.SetAnimatedSource(img, image);

编辑:Silverlight支持

根据josh2112的评论,如果你想在Silverlight项目中添加GIF动画支持,请使用github.com/XamlAnimatedGif/XamlAnimatedGif

其他回答

之前,我也遇到过类似的问题,我需要在你的项目中播放gif文件。我有两个选择:

使用WinForms中的PictureBox 使用第三方库,如codeplex.com的WPFAnimatedGif。

带有PictureBox的版本不适合我,而且项目不能为它使用外部库。所以我通过ImageAnimator的帮助,通过Bitmap为自己制作了它。因为,标准的BitmapImage不支持gif文件的回放。

完整的例子:

XAML

<Window x:Class="PlayGifHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded">

    <Grid>
        <Image x:Name="SampleImage" />
    </Grid>
</Window>

后面的代码

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));
    }
}

位图不支持URI指令,所以我从当前目录加载。gif文件。

我建议使用WebBrowser控件。

如果gif在网络上,你可以在XAML中设置源代码:

<WebBrowser Source="https://media.giphy.com/media/Ent2j55lyQipa/giphy.gif" />

如果它是一个本地文件,您可以从后台代码创建源代码。

XAML:

<WebBrowser x:Name="WebBrowser" />

后台代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    string curDir = Directory.GetCurrentDirectory();
    this.WebBrowser.Source = new Uri(String.Format("file:///{0}/10-monkey.gif", curDir));
}

我无法让这个问题最流行的答案(上面由达里奥提出)正常工作。结果是奇怪的、起伏不定的动画和奇怪的工件。 目前为止我找到的最佳解决方案: https://github.com/XamlAnimatedGif/WpfAnimatedGif

你可以用NuGet安装它

WpfAnimatedGif安装包

并使用它,在一个新的名称空间的窗口,你想添加gif图像,并使用它如下所示

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:gif="http://wpfanimatedgif.codeplex.com" <!-- THIS NAMESPACE -->
    Title="MainWindow" Height="350" Width="525">

<Grid>
    <!-- EXAMPLE USAGE BELOW -->
    <Image gif:ImageBehavior.AnimatedSource="Images/animated.gif" />

这个包非常简洁,你可以像下面这样设置一些属性

<Image gif:ImageBehavior.RepeatBehavior="3x"
       gif:ImageBehavior.AnimatedSource="Images/animated.gif" />

你也可以在你的代码中使用它:

var image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(fileName);
image.EndInit();
ImageBehavior.SetAnimatedSource(img, image);

编辑:Silverlight支持

根据josh2112的评论,如果你想在Silverlight项目中添加GIF动画支持,请使用github.com/XamlAnimatedGif/XamlAnimatedGif

我也搜索了一下,在旧MSDN论坛的一个帖子里找到了几个不同的解决方案。(链接不再工作,所以我删除了它)

最简单的执行似乎是使用WinForms PictureBox控件,并像这样(从线程中更改了一些东西,大部分是相同的)。

添加对System.Windows的引用。窗体,WindowsFormsIntegration和系统。首先绘制你的项目。

<Window x:Class="GifExample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
    xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    Loaded="Window_Loaded" >
    <Grid>
        <wfi:WindowsFormsHost>
            <winForms:PictureBox x:Name="pictureBoxLoading">
            </winForms:PictureBox>
        </wfi:WindowsFormsHost>
    </Grid>
</Window >

然后在Window_Loaded处理程序中,你会设置pictureBoxLoading。将ImageLocation属性设置为要显示的图像文件路径。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    pictureBoxLoading.ImageLocation = "../Images/mygif.gif";
}

在那个线程中提到了MediaElement控件,但也提到了它是一个相当笨重的控件,因此有许多替代方案,包括至少两个基于Image控件的自制控件,因此这是最简单的。

添加到主响应,建议使用WpfAnimatedGif,你必须在最后添加以下行,如果你是交换图像与Gif,以确保动画实际执行:

ImageBehavior.SetRepeatBehavior(img, new RepeatBehavior(0));
ImageBehavior.SetRepeatBehavior(img, RepeatBehavior.Forever);

所以你的代码看起来像这样:

var image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(fileName);
image.EndInit();
ImageBehavior.SetAnimatedSource(img, image);
ImageBehavior.SetRepeatBehavior(img, new RepeatBehavior(0));
ImageBehavior.SetRepeatBehavior(img, RepeatBehavior.Forever);