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 2

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:

// 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);
}
Это привело меня к мысли, что мне нужен растровый фрейм вокруг моего растрового изображения. Поэтому я изменил свой метод Base64StringToImageSource, и теперь он работает.
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);
    }
}

Файл должен быть a .ico, а не bmp / png / jpg