2016-05-06 9 views
1

Я создал пользовательскую библиотеку управления и создал элемент управления под названием «FlipView» в корневом пути. Затем я удалил стиль в Generic.xaml и переместил его в свой собственный словарь ресурсов с именем FlipView.xaml в корневом пути. Теперь я сливаю этот словарь ресурсов в Generic.xaml, используя следующий код:Pack URI не работает для обобщенных словарей generic.xaml

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/FlipView.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

Тогда я использовал элемент управления в другом МОФ проекте, но он бросает XamlParseException с InnerException говоря

Не удается найти ресурс «FlipView. XAML.

Почему это не так? Словарь ресурсов находится в корневом пути проекта библиотеки управления.

Если я заменю Source установщик имущества с "pack://application:,,,/MyCustomControls;component/FlipView.xaml" (MyCustomControls - это имя моей пользовательской библиотеки управления), он отлично работает.

Generic.xaml:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/MyCustomControls;component/FlipView.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

Почему это так?

Для проектов WPF это кажется излишним, поскольку pack://application,,,/ относится к корневому пути, а WpfAssemblyName;component/ снова относится к корневому пути. Почему это необходимо для Generic.xaml?

Редактировать: Я видел this вопрос, но он не объясняет почему.

ответ

1

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

As MSDN says:

Пакета URI для файла ресурсов, который компилируется в ссылочной сборку использует следующие полномочия и путь:

  • Authority: применение: ///.

  • Путь: имя файла ресурсов, который скомпилирован в ссылочную сборку. Путь должен соответствовать следующему формату:

    AssemblyShortName [; Version] [; PublicKey]; компонент/Path

    • AssemblyShortName: короткое имя для ссылочного сборки.
    • ; Версия [необязательно]: версия ссылочной сборки, которая содержит файл ресурсов. Это используется, когда загружаются две или более ссылочные сборки с таким же коротким именем.
    • ; PublicKey [необязательно]: открытый ключ, который использовался для подписи ссылочной сборки.Это используется, когда загружаются две или более ссылочные сборки с таким же коротким именем.
    • ; компонент: указывает, что на упомянутую сборку ссылается местная сборка.
    • /Путь: имя файла ресурса, включая его путь, относительно корня папки проекта сборной версии.

В следующем примере показана пакета URI для файла ресурсов XAML, который находится в корневой папке проекта ссылочной сборки.

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml 

Update:

Чтобы избежать лишних слов в адрес объявить стили в той же сборке, можно объявить, что ваш файл стилей без указания в библиотеку:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="FlipView.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

От: Clemens:

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

+0

№ Это не ссылка. Generic.xaml, flipview.xaml и flipview.cs находятся в корне библиотеки библиотеки управления. –

+1

Посмотрите на третий рисунок [здесь] (https://msdn.microsoft.com/en-us/library/aa970069 (v = vs.100) .aspx # The_Pack_URI_Scheme). Пакеты URI в приложении относятся к сборке приложений, даже если они используются в библиотеке. Ваш ресурс находится в ссылочной сборке, поэтому вам нужно будет указать его имя. – Clemens

+0

StepUp, это тоже не работает. @ Клеменс, это объясняет это. StepUp, можете ли вы уточнить ответ с комментарием Клеменса? Или, может быть, Клеменс может добавить ответ? –