Подтвердить что ты не робот

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

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

У меня есть изображение .jpg в папке "Ресурсы" моего проекта, и для изображения установлено значение "Создать действие: ресурс" (не встроенный ресурс) и никогда не копировать в папку вывода. Мое изображение не добавлено в файл resources.resx.

Я пытаюсь получить доступ к файлу следующим образом:

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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 пакета для ссылочных файлов ресурсов сборок может использоваться только с полномочием application:///. Например, в WPF не поддерживается следующее.

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Затем вам нужно всего лишь:

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

Ответ 5

Вероятно, вы создали эту вторую библиотеку как "Библиотека классов" вместо "Пользовательская библиотека 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)
)]

Ответ 6

Попробуйте следующее:

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