Подтвердить что ты не робот

Загрузка слияния ResourceDictionary из другой сборки не выполняется

Я поместил все свои приложения ResourceDictionaries в отдельную сборку и объединил их в один ResourceDictionary, который я хочу включить в качестве ресурса в свое приложение:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="InputStyles.xaml"/>
        <ResourceDictionary Source="DataGridStyles.xaml"/>
        <ResourceDictionary Source="ComboboxStyles.xaml"/>
        <ResourceDictionary Source="CheckboxStyles.xaml"/>
        <ResourceDictionary Source="TabControlStyles.xaml"/>
        <ResourceDictionary Source="ButtonStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Объявление ресурса:

<Window.Resources>
    <ResourceDictionary Source="pack://application:,,,/StyleAssembly;component/Styles.xaml"/>
</Window.Resources>

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

"Невозможно найти ресурс" inputstyles.xaml. "

Действие сборки устанавливается на "Страница" для всех файлов, и сборка для обоих проектов завершается успешно. Что я делаю неправильно?

4b9b3361

Ответ 1

Действие должно быть определено как ресурс или контент, если вы готовы выполнить некоторые действия на ногах.

Ваш ресурс должен быть определен как часть проекта как ресурс строить действия. Если вы включите в проект файл .xaml. Ресурс, вам не нужно копировать файл ресурсов на выход каталог, ресурс уже включен в состав выражение. Вы также можете использовать действие сборки контента, но тогда вы должны скопировать файлы в выходной каталог, а также развернуть ресурс файлы в одном и том же пути к исполняемому файлу.

Ответ 3

Из моего наблюдения. Настройка стиля построения ресурса-искателя на Resource может привести к причудливым ошибкам в будущем (я вдруг начал получать ошибки времени выполнения Cannot create X, где X был определяемым пользователем типом, указанным в моем ресурсном словаре).

Я рекомендую оставить стиль сборки в Page. Из того, что я видел, это должно работать нормально.

Ответ 4

См. это решение для обоих случаев , когда вы знаете внешний Assembly (имена файлов и т.д.) и , когда вы не знаете, и просто хотите итерации внешнего Assembly для ResourceDictionary(s) или UserControls.

Both XMAL and C# solution.

Обновление

Путь XAML: If you know the URI of the resource in an Assembly, then load it directly. Transform same syntax in XAML

ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

С# Путь: If you only know the Assambly and don't know the Resources in it

public ResourceDictionary GetResourceDictionary(string assemblyName)
{
    Assembly asm = Assembly.LoadFrom(assemblyName);
    Stream stream = asm.GetManifestResourceStream(asm.GetName().Name + ".g.resources");            
    using (ResourceReader reader = new ResourceReader(stream))
    {
        foreach (DictionaryEntry entry in reader)
        {
            var readStream = entry.Value as Stream;
            Baml2006Reader bamlReader = new Baml2006Reader(readStream);
            var loadedObject = System.Windows.Markup.XamlReader.Load(bamlReader);
            if (loadedObject is ResourceDictionary)
            {
                return loadedObject as ResourceDictionary;
            }
        }
    }
    return null;
}