Универсальные объединенные словари Windows 10

Итак, у меня есть библиотека универсальных классов Windows, в которой есть словарь ресурсов, который я хочу объединить с основным словарем ресурсов универсального приложения Windows 10 в App.xaml.

Мой App.xaml просто сливается с моим основным словарем ресурсов из той же сборки.

<Application.Resources>
    <ResourceDictionary>

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

    </ResourceDictionary>
</Application.Resources>

Затем из моего основного словаря ресурсов (Styles/Styles.xaml) я объединяю другие словари ресурсов из той же сборки. Здесь я хотел бы объединить словарь ресурсов из другой сборки:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Fields.xaml"/>
    <ResourceDictionary Source="DataTemplates.xaml"/>
    <!--<ResourceDictionary Source="/{AssemblyName};component/Shared.xaml" />-->
    <!--<ResourceDictionary Source="pack://application:,,,/{AssemblyName};component/Shared.xaml" />-->
    <ResourceDictionary Source="ms-appx:///{AssemblyName}/Shared.xaml" />
</ResourceDictionary.MergedDictionaries>

Я попытался добавить это в свой основной словарь ресурсов:

<ResourceDictionary Source="/{AssemblyName};component/Shared.xaml" />

и это...

<ResourceDictionary Source="ms-appx:///{AssemblyName}/Shared.xaml" />

Судя по этой статье о приложениях Магазина Windows 8.x, похоже, что должно работать. Но это все еще не работает.

и это...

<ResourceDictionary Source="pack://application:,,,/{AssemblyName};component/Shared.xaml" />

(это способ WPF, я знаю, но я все равно решил попробовать!)

Но вроде никто не работает...

Действие сборки словарей ресурсов, которые у меня есть в моей сборке приложения, установлено на «Страница». Эти словари ресурсов работают, просто используя это в слиянии:

<ResourceDictionary Source="Styles/Styles.xaml"/>

Я получаю следующую загадочную ошибку:

Не удалось присвоить свойству «Windows.UI.Xaml.ResourceDictionary.Source», поскольку тип «Windows.Foundation.String» не может быть назначен типу «Windows.Foundation.Uri». [Строка: 12 Позиция: 37]


person emseetea    schedule 13.11.2015    source источник
comment
Вы добавили свою библиотеку в качестве ссылки на проект? Я использую <ResourceDictionary Source="ms-appx:///MyLibrary/Resources.xaml"/> и вроде работает без проблем.   -  person Romasz    schedule 14.11.2015
comment
Как вы добавляете этот словарь ресурсов в объединенный словарь? Что происходит тогда?   -  person Igor Ralic    schedule 14.11.2015
comment
Да, {AssemblyName} добавляется как ссылка на проект моего приложения :)   -  person emseetea    schedule 14.11.2015
comment
Какое действие сборки установлено для словаря ресурсов в другой сборке?   -  person emseetea    schedule 14.11.2015
comment
Хорошо, кажется, что это работает с тем, что вы предложили, Ромаш. Я не уверен, как, но я подозреваю, что когда я пробовал все различные комбинации действия сборки/URI источника, я, должно быть, установил действие сборки на что-то другое, кроме страницы, когда пробовал эту технику.   -  person emseetea    schedule 14.11.2015


Ответы (2)


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

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///UserControlLibs/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

введите описание изображения здесь

person Jeffrey Chen    schedule 18.11.2015
comment
В приведенном вами примере предположим, что вы хотите, чтобы UserControlLibs был пакетом-самородком. В таком случае, как вы можете объединить словарь ресурсов? - person emseetea; 03.12.2015

Объединенные словари XAML сложнее, чем кажутся. Все хорошо, если вы ссылаетесь на локальный проект, тогда ваши пути Source= хорошо.

Если вы ссылаетесь на внешнюю библиотеку DLL (не в решение), папка DLL, на которую указывает ссылка, также должна содержать все файлы *.xml, *.xr.xml, *.xbf, *.jpg/png/gif. , и т.д.

Процедура, которой я следую: 1. Ссылочная DLL, содержащая объединенные словари (таблицы стилей XAML). 2. Убедитесь, что в эталонном пути есть все необходимые файлы. 3. Добавьте ссылку на объединенный словарь в ваш App.xaml.

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///NAMESPACE_HERE/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Этот файл PostBuild.bat описывает, как VS копирует все необходимые файлы при успешной сборке:

Echo Starting: PostBuildEvent: Call $(ProjectDir)PostBuild.Bat $(ProjectDir) $(OutDir) $(TargetPath) $(RootNameSpace)
Echo With Parameters: %1 %2 %3 %4

REM ***
REM *** Variables
REM ***
SET BuildLocationBin=..\..\..\..\..\..\..\..\bin

REM ***
Echo *** Publish to Bin
REM ***
MD %BuildLocationBin%
%WINDIR%\system32\attrib.exe %BuildLocationBin%\*.* -r /s
%WINDIR%\system32\xcopy.exe %1Properties\*.rd.xml %BuildLocationBin%\%4\Properties\*.* /s/r/y
%WINDIR%\system32\xcopy.exe %1%2*.png %BuildLocationBin%\%4\*.* /s/r/y
%WINDIR%\system32\xcopy.exe %1%2*.xbf %BuildLocationBin%\%4\*.* /s/r/y
%WINDIR%\system32\xcopy.exe %1%2*.xml %BuildLocationBin%\%4\*.* /s/r/y
%WINDIR%\system32\xcopy.exe %3 %BuildLocationBin%\*.* /s/r/y
%WINDIR%\system32\xcopy.exe %1%2*.pri %BuildLocationBin%\*.* /s/r/y

Echo *** Postbuild Complete ***

Надеюсь это поможет!

person Robert J. Good    schedule 29.12.2015
comment
Я обнаружил, что флажок «Создать макет библиотеки» можно найти в свойствах | Build, фактически размещает файлы в нужных местах. - person ericdes; 19.05.2016