【问题标题】:How do I display a Gif on Windows Phone when calling a StaticResource?调用 StaticResource 时如何在 Windows Phone 上显示 Gif?
【发布时间】:2012-01-23 17:25:43
【问题描述】:

我正在使用 RSS 提要在我的应用中显示内容。一切都很好,除了 gif 图像。我读过 Silverlight 不支持 gif 文件格式,所以我一直在尝试使用 ImageTools 插件。

似乎有很多示例,人们单击按钮并且图像显示在同一页面上,但我想在填充列表框时调用图像。

目前这是我所拥有的:

XAML:

xmlns:imagetools="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls"
....
<ListBox x:Name="Weather">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>

                            <imagetools:AnimatedImage Source="{Binding WeatherIcon, Converter={StaticResource DisplayGIF}}" />

                            <TextBlock Name="temperatureBlock" Text="{Binding WeatherTemperatureSummary}" TextWrapping="Wrap" Margin="12,0,0,0" FontSize="{Binding HeadlineSize}" Foreground="{Binding WeatherTemperatureSummary, Converter={StaticResource StylesAndColours}}" />
                            <TextBlock Name="summaryBlock" Text="{Binding Summary, Converter={StaticResource RssTextTrimmer}}" TextWrapping="Wrap" Margin="12,-6,0,10" FontSize="{Binding SummarySize}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

DisplayGif 类:

using ImageTools;
using ImageTools.IO;
using ImageTools.IO.Gif;
using System.Windows.Data;
using System.Text;
using System.IO;
using System.Windows.Media.Imaging;
public class DisplayGIF : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        byte[] buffer = Encoding.Unicode.GetBytes(value.ToString());
        Stream stream = new MemoryStream(buffer);
        ExtendedImage image = new ExtendedImage();
        ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
        return image.ToBitmap(); // give error that image is not loaded
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

上述代码失败,因为图像尚未加载。是否有解决此问题的方法,甚至有更好/更简单的方法来显示 gif 图像?

编辑 1

根据 Ku6opr 的回答,我改变了我的班级。当我现在启动我的应用程序时,它挂起,因为我怀疑我没有正确管理线程。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        byte[] buffer = Encoding.Unicode.GetBytes(value.ToString());
        Stream stream = new MemoryStream(buffer);
        ExtendedImage image = new ExtendedImage();
        ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
        image.SetSource(stream);
        EventWaitHandle Wait = new AutoResetEvent(false);
        image.LoadingCompleted += (s, e) =>
        {
            Wait.Set();
        };
        Wait.WaitOne();
        return image.ToBitmap();
    }

编辑 2:

好的,原来我试图链接到的 gif 图像不是可热链接的! Ku6opr 提供的链接确实有效 - 只需确保您实际上可以链接到来自外部来源的图像;)

http://www.java2s.com/Open-Source/ASP.NET/Silverlight/imagetools/ImageTools/Controls/ImageConverter.cs.htm

谢谢,

丰富

【问题讨论】:

    标签: silverlight windows-phone-7 gif


    【解决方案1】:

    可能是异步加载图像。我想,您需要等待它完全加载。 ExtendedImage 可能有一些事件(LoadingCompleted 或其他)

    public object Convert(object value, Type targetType, object parameter,         System.Globalization.CultureInfo culture)
    {
        byte[] buffer = Encoding.Unicode.GetBytes(value.ToString());
        Stream stream = new MemoryStream(buffer);
        ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
        ExtendedImage image = new ExtendedImage();
        image.Source = stream;
        EventWaithandle Wait = new AutoResetEvent(false);
        ExtendedImage.LoadingCompleted += (s, e) =>
        {
            Wait.Set();
        };        
        Wait.Wait();
        return image.ToBitmap(); // give error that image is not loaded
    }
    

    在我编写此代码时,我发现您从未将 Stream 分配给您的图像。检查一下

    编辑: ImageTools 已经有 ImageConverter 类与 StreamsAbsoluteRevative uri 路径一起使用。它的源码看里面你可以在这里找到:http://www.java2s.com/Open-Source/ASP.NET/Silverlight/imagetools/ImageTools/Controls/ImageConverter.cs.htm

    【讨论】:

    • 非常感谢您的帮助。我认为它让我走上了正确的道路;)我已经用你的建议更新了我的代码,但是由于等待线程块(我认为),现在加载时应用程序挂起。有什么建议可以解决这个问题?
    • ExtendedImage CreateOptions 喜欢BitmapImage 吗?如果是,设置为NoneImage会同步加载。
    • 根据文档页面,您可以调用 load complete 方法,但如果我这样做,我不确定如何在我的 Convert 方法中返回一个对象。 imagetools.codeplex.com/documentation 我将与该项目的开发人员取得联系,因为目前尚不清楚我应该做什么。一旦我弄清楚了,我会更新这个:)
    • ImageTools 已经有 ImageConverter 类,可用于 Streams、绝对和 revative uri 路径。请看:java2s.com/Open-Source/ASP.NET/Silverlight/imagetools/…
    • 请告诉我,什么评论对你有帮助,我会相应地编辑我的答案
    【解决方案2】:

    实际上,用于 WP7 的 Silverlight 不包括显示 gif 所需的编解码器。

    您应该将图像转换为支持的格式(PNG 或 JPG)。

    【讨论】:

    • 感谢您的反馈。当我只有一个指向在线文件的链接时,您是否知道如何执行此操作的任何示例?谢谢。
    • ImageTools 用于显示Gif。不要转换任何东西。
    • 根据msdn.microsoft.com/en-us/library/ff462087%28VS.92%29.aspx 所有设备都支持GIF。我错过了什么吗?
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2019-04-30
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多