WPF-ImageSource для значка окна из базовой строки 64 (или массива байт)
Я нахожусь в WPF и использую службу WCF для извлечения изображений в качестве базовых 64 кодированных строк. Я конвертировать в кодировке base-64 строки в ImageSource для назначения изображения.Источник. Я написал тестовое приложение для тестирования процесса, и все, казалось, работало нормально, пока я использовал только ImageSource для изображения.Источник. Но мне также нужно использовать некоторые источники изображений для иконок окон. Вот что я пытаюсь сделать:
ImageSource src = Util.Base64StringToImageSource(tbxBase64String.Text);
//img is a System.Windows.Controls.Image
img.Source = src; //This works just fine
//Class is a Window, so Icon is this.Icon (System.Windows.Window.Icon)
Icon = src; //This throws an InvalidOperationException - "ImageSource for Icon property must be an icon file."
И вот метод преобразования:
public static System.Windows.Media.ImageSource Base64StringToImageSource(string base64String)
{
using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(base64String)))
{
System.Windows.Media.Imaging.BitmapImage bi = new System.Windows.Media.Imaging.BitmapImage();
bi.BeginInit();
bi.StreamSource = stream;
bi.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
bi.EndInit();
bi.Freeze();
return bi;
}
}
Мне нужно знать, как получить ImageSource, который можно использовать для значка окна из базовой строки 64 (или массива байтов).
2 ответа:
Я решил ее. Я копнул еще немного и исследовал точную ошибку, которая была брошена. Вот stacktrace:
В Системе.Окна.Окно._OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) в системе.Окна.объект DependencyObject.OnPropertyChanged (DependencyPropertyChangedEventArgs e) в системе.Окна.Класс FrameworkElement.OnPropertyChanged (DependencyPropertyChangedEventArgs e) около Система.Окна.объект DependencyObject.NotifyPropertyChange (DependencyPropertyChangedEventArgs args) в системе.Окна.объект DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty в ДП, PropertyMetadata метаданных, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, логическое coerceWithDeferredReference, какой-либо сделке возникло какой-либо сделке возникло) в системе.Окна.объект DependencyObject.SetValueCommon(DependencyProperty в ДП, объект, значение, PropertyMetadata метаданных, логических coerceWithDeferredReference, какой-либо сделке возникло какой-либо сделке возникло, логическое isInternal) в системе.Окна.объект DependencyObject.SetValue (DependencyProperty dp, значение объекта) в системе.Окна.Окно.set_Icon (значение ImageSource) в ImageToBase64String.Главное окно.btnStrToImg_Click (отправитель объекта, RoutedEventArgs e) в c:\Data\Source\TorrentRover\TorrentRover\ImageToBase64String\ImageToBase64String\MainWindow.код XAML.cs: строка 48
Вы заметите, что исключение было брошено в Система.Окна.Окно._OnIconChanged. Вот как это выглядит при использовании ILSpy:
Это привело меня к мысли, что мне нужен растровый фрейм вокруг моего растрового изображения. Поэтому я изменил свой метод Base64StringToImageSource, и теперь он работает.// System.Windows.Window private static void _OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Window window = (Window)d; BitmapFrame bitmapFrame; if (e.NewValue == null) { bitmapFrame = null; } else { bitmapFrame = (e.NewValue as BitmapFrame); if (bitmapFrame == null) { throw new InvalidOperationException(SR.Get("IconMustBeBitmapFrame")); } } window.OnIconChanged(bitmapFrame); }
public static System.Windows.Media.ImageSource Base64StringToImageSource(string base64String) { using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64String))) { return BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); } }