Давайте разберемся, что вы делаете.
<Image Source="{Binding ImageSource}" />
Чтобы это работало, источником привязки должен быть либо ImageSource, либо строка, представляющая URI для файла изображения. Итак, давайте посмотрим, что на самом деле представляет собой свойство ImageSource.
public string ImageSource { get; set; }
Одна проблема здесь в том, что ImageSource не вызывает события PropertyChanged. Поэтому WPF не будет обновлять цель привязки при обновлении свойства.
Но также ImageSource - это не ImageSource, а строка. Это нормально, но WPF будет интерпретировать эту строку как URI. Что это за URI?
ImageSource = Base64StringToImage(BIG_HONKING_STRING).Source.ToString();
Это суть вашей проблемы. Строка ImageSource на самом деле не является URI, потому что ваше изображение не является адресуемым ресурсом. Base64StringToImage создает ImageSource в памяти из строки base64, а затем возвращает Image с этим в качестве источника. Затем вы берете источник изображения (который является объектом ImageSource) и структурируете его. Это может сработать, если ImageSource получен из файла или URL, но это не так: он получен из HBITMAP. Таким образом, результат ToString () будет бессмысленным. Поэтому ImageSource устанавливается на что-то бессмысленное, и ваше изображение пытается интерпретировать эту бессмысленную вещь как URL-адрес файла растрового изображения.
Итак, чтобы исправить это, вам нужно сделать три вещи:
- Вызовите событие PropertyChanged для свойства ImageSource (или сделайте его свойством зависимости).
- Измените свойство ImageSource на тип ImageSource вместо строки типа (чтобы оно могло содержать источники изображений без URL).
- Измените ваш установочный вызов, чтобы установить ImageSource на
Base64StringToImage(...).Source
- то есть удалите вызов ToString (). Более того, измените Base64StringToImage, чтобы он возвращал ImageSource, а не Image: создание элемента Image просто создает накладные расходы, потому что все, что вас действительно интересует, это BitmapSource.