Как отобразить Gif на Windows Phone при вызове StaticResource? - PullRequest
0 голосов
/ 22 января 2012

Я использую 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

Основываясь на ответе Ку6опра, я изменил свой класс. Когда я запускаю свое приложение, оно зависает, так как я подозреваю, что неправильно управляю потоками.

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:

Хорошо, оказалось, что картинки, на которые я пытался сослаться, не были горячими! Ссылка, предоставленная Ku6opr, работает - просто убедитесь, что вы действительно можете ссылаться на изображения из внешнего источника;)

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

Спасибо

Rich

Ответы [ 2 ]

1 голос
/ 22 января 2012

Возможно, оно загружает изображение асинхронно.Я думаю, вам нужно подождать, пока он полностью загрузится.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, который работает с Streams, Absolute и Revative путями URI.Это исходный код, чтобы заглянуть внутрь вы можете найти здесь: http://www.java2s.com/Open-Source/ASP.NET/Silverlight/imagetools/ImageTools/Controls/ImageConverter.cs.htm

0 голосов
/ 22 января 2012

На самом деле Silverlight для WP7 не содержит необходимых кодеков для отображения изображений.

Необходимо преобразовать изображения в поддерживаемый формат (PNG или JPG).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...