Абсолютные и относительные URI пакетов Wpf Относительные URI пакетов

#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 в подпапке.

Смотрите Изображение ниже для примера того, как это выглядит во время выполнения:

Абсолютные и Относительные URI пакетов

Комментарии:

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».