在调用StaticResource时如何在Windows Phone上显示Gif?

时间:2012-01-22 12:15:58

标签: silverlight windows-phone-7 gif

我正在使用RSS Feed在我的应用中显示内容。除了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

谢谢,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上,Silverlight for WP7不包含用于显示gif的必要编解码器。

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