Nano Hash - криптовалюты, майнинг, программирование

Как отобразить Gif на Windows Phone при вызове StaticResource?

Я использую RSS-канал для отображения контента в своем приложении. Все отлично работает, кроме гифок. Я читал, что 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

Спасибо,

Богатый


Ответы:


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 своему изображению. Проверь это

EDIT: ImageTools уже имеет класс ImageConverter, который работает с путями uri Streams, Absolute и Revative. Исходный код для просмотра внутри вы можете найти здесь: http://www.java2s.com/Open-Source/ASP.NET/Silverlight/imagetools/ImageTools/Controls/ImageConverter.cs.htm

22.01.2012
  • Большое спасибо за вашу помощь. Я думаю, что это отправляет меня по правильному пути;) Я обновил свой код с вашими предложениями, но приложение зависает при загрузке сейчас из-за блока потока ожидания (я думаю). Любые предложения обойти это? 22.01.2012
  • ExtendedImage CreateOptions нравится BitmapImage? Если да, установите None, и Image будет загружаться синхронно. 22.01.2012
  • Согласно странице документации, вы можете вызвать метод завершения загрузки, но я не уверен, как вернуть объект в моем методе Convert, если я это сделаю. imagetools.codeplex.com/documentation Я свяжусь с разработчиком этого проекта как просто непонятно, что мне делать. Я обновлю это, как только разберусь :) 22.01.2012
  • ImageTools уже имеет класс ImageConverter, который работает с потоками, абсолютными и восстановительными путями uri. Пожалуйста, посмотрите: java2s .com/Open-Source/ASP.NET/Silverlight/imagetools/ 22.01.2012
  • Скажите, пожалуйста, какой комментарий вам поможет, и я соответствующим образом отредактирую свой ответ. 23.01.2012
  • Привет, Ku6opr, я обнаружил, что приведенный вами пример ссылки работает отлично. Мой предыдущий код преобразования только пытался сделать то же самое. Простой пример, который вы предоставили в ссылке, объясняет, какой тип объекта следует передать обратно. Как я упоминал в своем редактировании, веб-сайт, с которого я брал изображение, фактически блокировал горячие ссылки, поэтому он никогда не работал. Пошел с другим сайтом, и все работает как положено :) 23.01.2012

  • 2

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

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

    22.01.2012
  • Спасибо за ответ. Знаете ли вы какие-нибудь примеры того, как это сделать, когда все, что у меня есть, это ссылка, указывающая на файл в Интернете? Спасибо. 22.01.2012
  • ImageTools для отображения Gif. Ничего не конвертируйте. 22.01.2012
  • Согласно msdn.microsoft.com/en-us/ library/ff462087%28VS.92%29.aspx GIF поддерживается на всех устройствах. Я что-то упускаю? 31.05.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..