#c# #.net #wpf #windows
#c# #.net #wpf #Windows
Вопрос:
Мой вопрос: я неправильно читаю MSDN ИЛИ MSDN неверен?Я пытаюсь ссылаться на ресурс изображения через относительный URI.
На странице MSDN, озаглавленной «URI пакетов в WPF«, четко указано, что:
«Файл ресурсов во вложенной папке локальной сборки» = «/Subfolder/ResourceFile.xaml«
в таблице 2: относительные URI в разметке (здесь http://msdn.microsoft.com/en-gb/library/aa970069.aspx ).
Итак, я создал новые проекты WPF / .NET 4.0 в Vs2010 (v10.0.40219.1 SP1Rel) для тестирования.
Startup Project: TryUri
App.xaml
MainWindow.xaml
Custom Ctrl Project: TryUri.CCL
Icons/folder.png <-- Marked As Resource!
Views/TestUC.xaml
В TestUC.xaml:
<Canvas>
<Border>
<Image Source="/Icons/folder.png" Height="Auto" Width="Auto" />
</Border>
</Canvas>
В MainWindow.xaml:
// xmlns:uc="clr-namespace:TryUri.CCL.Views;assembly=TryUri.CCL"
<uc:TestUC />
Результат: изображение не отображается !!
Когда я меняю путь на «.. / Icons / folder.png», это действительно работает.
Если я скопирую Icons/ folder.png в папку TryUri.CCL/Views/, тогда «Icons/folder.png» будет работать.
Однако я никогда не смогу заставить начальную косую черту работать так, как в «/ Icons / folder.png», как указано в MSDN.
Комментарии:
1. Я предполагаю, что ваш рабочий каталог установлен неправильно в вашем проекте. Я бы сначала это проверил.
2. Рабочий каталог имел бы значение, если бы я пытался получить доступ к png в виде файла. Я нет, он помечен как ресурс. Я обновил вопрос, чтобы прояснить это. Спасибо.
3. Я сам ответил ниже. Для моего проекта я решил просто использовать пути относительно разметки (т.Е. «.. / icons / folder.png»), поскольку это самый простой выбор IMO.
Ответ №1:
Причина, по которой при запуске как отдельной сборки ваш относительный URI пакета должен начинаться с ../
обратной косой черты или без нее, заключается в том, как используются относительные URI из MSDN (выделение мое):
Абсолютные и Относительные URI пакетов
…
Однако, если используется начальная обратная косая черта, ссылка на URI относительного пакета считается относительной к корню приложения.
Поэтому, если вы хотите, чтобы изображения оставались относительно вашей ссылочной сборки, просто опустите начальную косую черту или используйте ../
if в подпапке.
Смотрите Изображение ниже для примера того, как это выглядит во время выполнения:
Комментарии:
1. Я пробовал это, и это не работает с косой чертой. Я должен использовать «Icons / folder.png», чтобы это работало.
2. Спасибо за обновление. Можете ли вы прокомментировать ссылку на свой код? Мне любопытно, как у вас это получилось. Кроме того, похоже, что вы оставили свои TestUC и TestUC2.xaml в папке /Views WpfControlLibrary1 вопреки вашему ответу.
3. Я пересматриваю свой ответ, я считаю
..
, что это необходимо из-за того, как вашUserControl
используется во время выполнения.
Ответ №2:
Ответ таков: начальная косая черта в относительном пути всегда преобразуется в основную сборку, А НЕ в сборку, в которой находится разметка.
Чтобы заставить его работать так, как указано в MSDN, мне пришлось бы хранить все значки в папке «Icons /» в основной сборке, а не в пользовательской управляющей dll.
Если вы решите хранить ресурсы в сборке dll в папке «Icons /», вы должны указать на них путь относительно разметки, над которой вы работаете (т. Е. « ../Icons/folder.png
«), или вы должны указать путь с именем сборки (т.Е. « /AssemblyName;component/Icons/folder.png
«)
Ответ №3:
Просто замените <ApplicationName> на имя вашего приложения, и это должно сработать
Source="/<ApplicationName>;component/Icons/folder.png"
Комментарии:
1. Спасибо. Я знаю, что это сработает, но я хочу знать, почему MSDN говорит, что я могу просто сделать «/ Subfolder/Resource.file-ext».