Загрузка изображений в WPF из кода

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

У меня есть .jpg-изображение в папке Resources моего проекта, и изображение настроено на Build Action: Resource (не встроенный ресурс) и никогда не копировать в выходную папку. Мой образ не добавил к моим ресурсам.файл resx.

Я пытаюсь получить доступ к файлу так:

lResult = new BitmapImage(new Uri(@"pack://application:,,,/Resources/ImageMissing.jpg", UriKind.Absolute));

но это не говорит о том, что нет изображения там.

Это так просто, я чувствую себя очень глупо, но я просто не могу понять простую концепцию использования ресурсов.

спасибо.

6 ответов


Если вам нужно указать, что на ресурс, на который ссылаются, ссылаются из локальной сборки, тогда я думаю, что вы захотите включить "компонент". Например, у меня есть код, который загружает значок из ресурса, доступного из той же сборки, в которой находится мой код. Я пишу это:

var SourceUri = new Uri("pack://application:,,,/MyCompany.MyProduct.MyAssembly;component/MyIcon.ico", UriKind.Absolute);
thisIcon = new BitmapImage(SourceUri);

как отмечено в статье, доступной по адресу http://msdn.microsoft.com/en-us/library/aa970069.aspx, следующие дополнительные примеры иллюстрируют использование из "компонента":

в следующем примере показан URI пакета для файла ресурсов XAML, расположенного в корневом каталоге проекта указанной сборки.

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

в следующем примере показан URI пакета для файла ресурсов XAML, расположенного во вложенной папке папки проекта указанной сборки.

pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

в следующем примере показан URI пакета для файла ресурсов XAML, расположенного в корневой папке ссылочного файла, папка проекта сборки для конкретной версии.

pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml

обратите внимание, что синтаксис URI пакета для ссылочных файлов ресурсов сборки может использоваться только с приложением: / / / authority. Например, в WPF не поддерживается следующее.

pack://siteoforigin:,,,/SomeAssembly;component/ResourceFile.xaml

вам нужна еще одна запятая там. Вот документация по URI типа "Pack" в WPF. Обратите внимание, что при использовании полномочий есть три запятые.

lResult = new BitmapImage(new Uri(@"pack://application:,,,/Resources/ImageMissing.jpg", UriKind.Absolute));

вам удалось переименовать файл (или папку) в обозревателе решений, а затем не очистить или перестроить приложение?

Если вы уверены, что имя в URI соответствует тому, что находится в обозревателе решений, попробуйте щелкнуть правой кнопкой мыши решение и выбрать "перестроить".


проблема в том, что изображение не было добавлено в ваш проект-включение его в файл ресурсов недостаточно.

щелкните правой кнопкой мыши проект > добавить существующий элемент > найдите и добавьте изображение.

затем все, что вам нужно сделать, это:

myImage = new BitmapImage(new Uri(@"ImageMissing.jpg", UriKind.RelativeOrAbsolute));

вероятно, вы создали эту вторую библиотеку как "библиотеку классов" вместо "пользовательской библиотеки WPF". Создание файлов xaml или встраивание изображений в качестве "ресурсов" в библиотеку классов недостаточно для WPF, вероятно, в AssemblyInfo отсутствует следующее.cs файл:

Свойства / AssemblyInfo.cs

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
  //(used if a resource is not found in the page, 
  // or application resource dictionaries)
  ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
  //(used if a resource is not found in the page, 
  // app, or any theme specific resource dictionaries)
)]

попробуйте это:

var icon = BitmapFrame.Create(Application.GetResourceStream(
new Uri("MyAppBitmap.jpg", UriKind.RelativeOrAbsolute)).Stream);