Я использую 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, работает — просто убедитесь, что вы действительно можете ссылаться на изображения из внешнего источника;)
Спасибо,
Богатый
ExtendedImage
CreateOptions
нравитсяBitmapImage
? Если да, установитеNone
, иImage
будет загружаться синхронно. 22.01.2012ImageTools
уже имеет классImageConverter
, который работает с потоками, абсолютными и восстановительными путями uri. Пожалуйста, посмотрите: java2s .com/Open-Source/ASP.NET/Silverlight/imagetools/ 22.01.2012