Wpf абсолютные и относительные URI пакета - PullRequest
6 голосов
/ 14 октября 2011

У меня такой вопрос: я неправильно читаю 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.

Ответы [ 3 ]

13 голосов
/ 14 октября 2011

При запуске в качестве отдельной сборки ваш URI Relative Pack должен начинаться с ../ или без обратной косой черты из-за того, как используются относительные URI, из MSDN (выделено мной) :

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

...

Однако, если используется начальная обратная косая черта тогда ссылка на относительный URI пакета считается относительно корня приложения .

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

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

Absolute vs. Relative Pack URIs

7 голосов
/ 14 октября 2011

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

Чтобы все работало так, как указано в MSDN, мне нужно было бы хранить все значки в папке «Значки /» в основной сборке, а не в dll пользовательского элемента управления.

Если вы решили хранить ресурсы в сборке dll в папке «Значки /», вы должны указать им путь относительно разметки, с которой вы работаете (то есть «../Icons/folder.png»), ИЛИ вы должны соответствовать путь с именем сборки (то есть "/AssemblyName;component/Icons/folder.png")

4 голосов
/ 14 октября 2011

Просто замените на имя вашего приложения, и это должно работать

Source="/<ApplicationName>;component/Icons/folder.png"
...