Во время разработки пакет URI действителен, но не во время выполнения? - PullRequest
9 голосов
/ 27 июля 2011

Я устанавливаю содержимое кнопки в изображение. Это выглядит примерно так:

<Button>
   <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" />
</Button>

В моем проекте у меня есть подпапка с именем NavigationImages, и в этой папке находится файл изображения nav_up_left.png.

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

Действие Build установлено в Resource.

На самом деле, это работало нормально в одном проекте. Но когда я скопировал его на другой проект, он потерпел неудачу. Это кажется невероятно простой проблемой, но я нахожусь в тупике и готов начать вырывать волосы. @ _ @

Ваши мысли и предложения будут высоко оценены!

Ответы [ 4 ]

10 голосов
/ 27 июля 2011

Дракончик, я понял это ... вроде.

Я скопировал этот код xaml из одного проекта, в котором тип вывода - «Приложение Windows», в другой проект, где тип вывода - «Библиотека классов».

В то время я не думал об этом, но, очевидно, когда типом вывода является библиотека классов, URI пакета необходимо изменить.

Поэтому вместо "pack://application:,,,/NavigationImages/nav_up_left.png" я изменил его на"/ProjectName;component/NavigationImages/nav_up_left.png" и теперь он работает просто отлично.

Я не уверен на 100%, почему это работает, а не первое.Я прочитал документацию MSDN по URI пакетов в WPF , но, возможно, я что-то неправильно истолковал.

Я оставлю этот ответ без проверки, если кто-то может дать мне хорошее объяснение, почему то, что у меня ранее было, не работает в проекте с выходным типом Class Library.

Я, вероятно, упускаю что-то действительно простое.@ _ @

3 голосов
/ 30 октября 2013

Я только что некоторое время боролся с этой же проблемой, и я думаю, что частью того, что пошло не так в оригинале, было пропущенное слово «компонент».У меня, например, было

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg");

, но должен иметь

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg");

Слово "компонент" не является частью имени пути, несмотря на его появление -- это строковый литерал, который должен быть там.Зачем?Кто-то думал, что это хорошая идея, наверное.

А для тех, кто борется с другой частью дела, как насчет "MyApp"?Это название Ассамблеи.Щелкните правой кнопкой мыши на имени вашего проекта, выберите «Свойства ...», и на вкладке «Приложение» вы увидите поле «Имя сборки:».

Если вам не хочется искать это (или беспокоиться о том, что это может измениться, нарушая ваш код), вы можете сделать это:

String appUri = @"pack://application:,,,/" + 
                  System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";";
String path = appUri + "component/images/mona2.jpg";
myBitmapImage.UriSource = new Uri(path);

Не очень красивый код, я признаю- оно может быть явно сокращено - но, надеюсь, оно приведет вас туда, куда вам нужно.Не забудьте установить для свойства «Build» в вашем файле изображения значение «Resource»!

2 голосов
/ 22 февраля 2013

Просто чтобы пролить свет на то, что происходило в вашей ситуации.Второй пакет Ури.Тот, который работал.Предназначен для ресурсов, расположенных в сборке, отличной от хост-приложения.Судя по всему, приложение хоста загружало этот ресурс из рассматриваемой библиотеки классов?

Различия в схемах пакетов URI можно увидеть здесь: Схема URI пакета MSDN

Uri слегка изменяется при обращении к ресурсу из основной сборки и ссылкам на один из другой сборки.

Кроме того, pack: // application: ,,, включает в себя то, что называется "полномочия ", если его опустить, это в основном сделает его относительным путем, оба допустимы в большинстве случаев, когда предполагается, что права доступа приложения.

РЕДАКТИРОВАТЬ: в основном потому, что /Subfolder/Resource.xaml(.jpg и т. д.)/Assembly;component/Resource.xaml очень похожи, последний говорит парсеру / загрузчику, что он ищет сборку, на которую ссылаются, а не сборку основного приложения.(Я полагаю, это помогает ускорить поиск).

1 голос
/ 17 августа 2012

Еще одно решение для получения этого права:

Как только ваше изображение Build Action будет установлено в «Ресурс» и вы восстановите его, перейдите к свойствам вашего <Image /> объекта.В окне свойств появится браузер файловых ресурсов ... , после чего при выборе вашего изображения атрибут Source="..." вашего <Image /> будет заполнен правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...