如何在WP 7中使用gif动画图像

时间:2012-03-12 13:23:24

标签: c# silverlight windows-phone-7 silverlight-4.0 silverlight-3.0

我看过这篇文章:Display GIF in a WP7 application with Silverlight

但在我的情况下呢?动画我正在使用弹出窗口。因此,当应用程序启动时,它会显示一个弹出窗口5秒钟。在这个弹出窗口中,我想显示一些.gif图像,但它不起作用。

以下是我实施的代码:

    public partial class AnimatedSplashScreen : UserControl
    {
        protected Uri ImageSource
        {
            get;
            set;
        }
        public AnimatedSplashScreen()
        {
            InitializeComponent();
           ImageSource =
                new Uri(
                    "http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Sunflower_as_GIF.gif/200px-Sunflower_as_GIF.gif",
                    UriKind.Absolute);
            ImageTools.IO.Decoders.AddDecoder<GifDecoder>();

        }

xaml代码是:

<UserControl.Resources>

        <imagetools:ImageConverter x:Key="ImageConverter" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot"
          Width="480"
          Height="800"
          Background="White">
        <imagetools:AnimatedImage Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"  />

但结果它不起作用,它显示一个空的背景。

更新: ImageTools.IO.Decoders.AddDecoder();             ImageSource = new Uri(“http://a3.twimg.com/profile_images/1136683647/hisoka_normal.gif”,UriKind.Absolute);  它仍然无效

1 个答案:

答案 0 :(得分:6)

最后工作......谈论密谋攻击你的事件......你需要先修复所有这些事情!

(请注意,只有前2帧被动画,但这是另一个问题,存在以下问题)

第6部分(现在昏昏欲睡)

最后ImageTools.Controls.ImageConverter不支持以“/”开头的相对图片网址,因此您需要使用不带前导“/”的相对网址。我发现一旦解决了所有其他问题,我就会在路径上得到一个不受支持的异常。

        ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
        InitializeComponent();
        this.ImageSource = new Uri("layer1.gif", UriKind.Relative);
        this.DataContext = this;

第5部分

您需要在某处设置绑定DataContext。

您没有将XAML页面DataContext连接到后面的代码对象。我无法看到你在哪里做到了这一点。一种非常简单/快速的方法是在页面的构造函数中设置this.DataContext = this;

第4部分

您只能绑定到公共属性!

您的ImageSource媒体资源目前受到保护。将其更改为Public

    public Uri ImageSource
    {
        get;
        set;
    }

第3部分

我还注意到您的ImageSource属性不是INotifyPropertyChange类型属性。因此,在InitializeComponent之后设置它将不起作用。

以这种方式尝试(或将其更改为使用通知属性):

public AnimatedSplashScreen()
{
   ImageSource =
        new Uri(
            "/200px-Sunflower_as_GIF.gif",
            UriKind.Relative);
    ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
    InitializeComponent();
}

第2部分(实际上不受ImageTools.Controls.ImageConverter支持)

跨域文件显然只是一个问题。根据评论,您还需要将图像存储在您自己的网站上,并使用适当的URI格式进行引用。

如果您将文件放在ClientBin下名为images的文件夹中,请使用以下格式:

"/images/imagename.jpg"

这是最佳选择,因为图像也使用浏览器缓存!

对于你的例子,它将是这样的:

    ImageSource =
                new Uri(
                    "/images/200px-Sunflower_as_GIF.gif",
                    UriKind.Relative);
            ImageTools.IO.Decoders.AddDecoder<GifDecoder>();

并将示例文件放在图像下的客户端bin文件夹中。

如果你不使用前导“/”Silverlight假设文件是​​当前模块中的资源,例如。

"images/imagename.jpg"

第1部分

这实际上是一个版权问题,阻止人们在未经许可的情况下将文件与其他人的网站进行深层链接。

Wikimedia.org网站没有任何跨域访问文件,例如:

...大概是因为他们不希望别人使用他们在自己网站之外托管的文件。

这意味着Silverlight不允许访问这些网站上的文件,因为它是良好的互联网公民。尝试在您自己的站点(Silverlight应用程序所在的位置)托管文件,然后根本不需要任何跨域访问文件。

旁注:如果您确实需要网站上的跨域文件,供Silverlight使用,请使用crossdomainpolicy.xml,因为另一个文件没有那么有用(专为较旧的Flash使用而设计)