3

嗯,这已经解决了。我不知道这是否是我的一个小故障,或者 ImageTools 是否只是一个痛苦的设置。谢谢大家的回答,他们很可能都有效。一旦我标记为已回答确实有效,但方法如下:

(感谢 Patrick 坚持这一点,他的代码如下所述。)

(另外,也非常感谢其他提交了一些东西的人。对不起,如果我的菜鸟把你们吓跑了)

要让动画 Gif 在您的 wp7 7.1 应用程序中工作,请执行以下步骤:

1)下载ImageTools(我当时用的是最新版本(0.3))http://imagetools.codeplex.com/downloads/get/156530

2) 解压文件,然后在“Bin > Phone”文件夹中将所有* dll 文件扩展名放入您的 wp7 应用程序文件夹中。不需要添加其他文件 (xml/pdb)。(*这一步是额外的工作,我们稍后会删除这些额外的 dll,但它会省去头疼的问题。)

3) 在解决方案资源管理器窗口 > 参考文件夹下拉菜单中添加对 wp7 应用程序的引用。为此,请右键单击“引用”文件夹,单击“添加引用”并浏览到 dll 文件。重复这个过程。(最终引用所有这些 dll 是额外 2 分钟工作中的 1 分钟,但编译时不应出现任何错误)

4) 现在在要添加图像的 xaml 页面上,将其添加到标题代码的顶部:

xmlns:it="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls"
xmlns:vm="clr-namespace:GifViewer.ViewModels"

注意:将“GifViewer”更改为您的应用程序名称。

5) 在同一页面的正下方,添加以下代码:

<phone:PhoneApplicationPage.DataContext>
    <vm:MainViewModel/>
</phone:PhoneApplicationPage.DataContext>

<Grid x:Name="LayoutRoot" Background="Transparent">
    <it:AnimatedImage  Source="{Binding AnimationImage}" />
</Grid>

注意:不一定是网格。根本不需要任何东西。它可以独立存在。

6)接受的答案在应用程序中有一个名为“ViewModels”的文件夹,其中有一个名为“MainViewModel”的自定义类因此在解决方案资源管理器或桌面中,添加一个名为 ViewModels 的文件夹并制作名为 MainViewModel 的 ac# 类页面。将其移动到该文件夹​​中,然后刷新解决方案资源管理器。如果看不到文件,则需要单击解决方案资源管理器标题下的“显示所有文件”按钮。

7)使用下面接受的答案,在“MainViewModel.cs”类页面中,在其他页面下方添加以下内容:

using ImageTools;
using ImageTools.Controls; 
using ImageTools.IO;
using ImageTools.IO.Gif;

8) 接受的答案使用此代码。复制此代码时将“GifViewer”更改为您的应用程序名称,并更改 gif 的 Uri 位置。在我的示例中,我有一个名为“Gif”的文件夹,其中包含“explosion.gif”。默认情况下,构建操作可以保留为资源。

namespace GifViewer.ViewModels {
    public class MainViewModel : DependencyObject {
        public MainViewModel() {
            Decoders.AddDecoder<GifDecoder>();
            Uri uri = new Uri("Gif/explosion.gif", UriKind.Relative);
            ExtendedImage image = new ExtendedImage();
            // either of these two method work.
            // Just remove the first / to switch
            //*
            image.LoadingCompleted +=
                (o, e) => Dispatcher.BeginInvoke(() => AnimationImage = image);
            image.UriSource = uri;
            /*/
            Stream stream = Application.GetResourceStream(uri).Stream;
            GifDecoder decoder = new GifDecoder();
            decoder.Decode(image, stream);
            AnimationImage = image;
            /**/
        }

        public static readonly DependencyProperty AnimationImageProperty =
            DependencyProperty.Register("AnimationImage",
                typeof(ExtendedImage),
                typeof(MainViewModel),
                new PropertyMetadata(default(ExtendedImage)));

        public ExtendedImage AnimationImage {
            get { return (ExtendedImage)GetValue(AnimationImageProperty); }
            set { SetValue(AnimationImageProperty, value); }
        }
    }
}

继续编译。您可能会收到指示无法加载的运行时错误,但运行应用程序应该可以摆脱它。

你的 gif 现在应该可以播放了。

9) 开始删除不需要的额外 dll 引用(2 分钟额外工作的另一分钟)。基本上,您想要引用的只是:

ImageTools
ImageTools.Controls
ImageRools.IO.Gif 

甚至可能不需要 ImageTools.Controls,但文件大小为 25kb,老实说,如果我删除它,我无法获得 gif 显示。

给你!


我问的原始问题

试图让我的动画 gif 在我的 WP7 应用程序中播放时,我头疼得厉害。尽管有 imagetools 并在 stackoverflow/web 上查看当前的“解决方案”,但我根本无法连接这些点来实现这一点。

下面概述了我的问题,但作为参考,我查看了: Display GIF in a WP7 application with Silverlighthttp://blog.naviso.fr/wordpress/?p=733

那么,如何将这个破事设置为在 wp7 应用程序中显示动画 gif 呢!?具体问题 - 这是让我的动画 gif 出现的正确代码吗?如果没有,下面需要修复什么?

我在手机上的动画 gif 文件位置(不是来自互联网):

GIF/爆炸.gif

Xaml 主页:

xmlns:imagetools="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls" 
....

<phone:PhoneApplicationPage.Resources>
        <imagetools:ImageConverter x:Key="ImageConverter" />
</phone:PhoneApplicationPage.Resources>

....
<imagetools:AnimatedImage x:Name="animationgif" Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}" />

以及 xaml 页面背后的代码:

public partial class MainPage : PhoneApplicationPage
{
 using ImageTools;
 using ImageTools.Controls;
 using ImageTools.IO.Gif;

 public MainPage()
    {
        InitializeComponent();
        ImageTools.IO.Decoders.AddDecoder<ImageTools.IO.Gif.GifDecoder>();
    }


 public void eventtofiretoshowexplosion_gif(object sender, MouseButtonEventArgs e)
 {
   // A main problem -- this code doesn't work by itself, as what is the ImageSource!?
   // It cannot be used as a variable it says.
   // animationgif.ImageSource does not work at all (not a method).
   ImageSource = new Uri("http://mysite/my.gif", UriKind.Absolute);
 }
}

在过去的几个小时里,这一直困扰着我,我真的需要一些帮助。如果对此有快速修复,请提供帮助并展示它是如何完成的,而不是引导我进入页面。我已经看过太多关于这个的页面了,虽然每个页面都声称可以工作,但它不能在我的应用程序中使用。

4

2 回答 2

3

您的图像的构建操作似乎不正确,因此应用程序无法“找到”资源。

你有两个选择。将构建操作设置为内容,或将其设置为资源并指定“如果较新则复制”。

  • 打开您的解决方案资源管理器
  • 打开你的属性窗口
  • 点击你的图片
  • 将构建操作设置为Resource并复制到输出目录Copy if newer

进一步阅读:WPF 中的资源 – I(二进制资源)


鉴于上述资源“要求”,我使用视图模型整理了一个小示例,该示例似乎可以工作。我希望你会发现它有用。viewmodel 类位于名为 ViewModels 的文件夹中。

using System;
using System.IO;
using System.Windows;
using ImageTools;
using ImageTools.IO;
using ImageTools.IO.Gif;

namespace GifViewer.ViewModels {
    public class MainViewModel : DependencyObject {
        public MainViewModel() {
            Decoders.AddDecoder<GifDecoder>();
            Uri uri = new Uri("Gif/explosion.gif", UriKind.Relative);
            ExtendedImage image = new ExtendedImage();
            // either of these two method work.
            // Just remove the first / to switch
            //*
            image.LoadingCompleted +=
                (o, e) => Dispatcher.BeginInvoke(() => AnimationImage = image);
            image.UriSource = uri;
            /*/
            Stream stream = Application.GetResourceStream(uri).Stream;
            GifDecoder decoder = new GifDecoder();
            decoder.Decode(image, stream);
            AnimationImage = image;
            /**/
        }

        public static readonly DependencyProperty AnimationImageProperty =
            DependencyProperty.Register("AnimationImage",
                typeof(ExtendedImage),
                typeof(MainViewModel),
                new PropertyMetadata(default(ExtendedImage)));

        public ExtendedImage AnimationImage {
            get { return (ExtendedImage)GetValue(AnimationImageProperty); }
            set { SetValue(AnimationImageProperty, value); }
        }
    }
}

和xml

<phone:PhoneApplicationPage 
    x:Class="GifViewer.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:it="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls"
    xmlns:vm="clr-namespace:GifViewer.ViewModels"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <phone:PhoneApplicationPage.DataContext>
        <vm:MainViewModel/>
    </phone:PhoneApplicationPage.DataContext>

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <it:AnimatedImage  Source="{Binding AnimationImage}" />
    </Grid>
</phone:PhoneApplicationPage>
于 2012-09-11T18:06:35.983 回答
0

使用 AnimatedImage 时,您的源绑定必须返回 ExtendedImage。ExtendedImage 类基本上是普通 Image 控件的“BitmapImage”等价物。

于 2012-09-10T19:13:43.753 回答