Слияние словарей ресурсов

я пытаюсь объединить wpf словари ресурса по коду позади, но по некоторой причине это не работает. Если я пробую, объединяют словари по самому документу, он работает, например:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication212;assembly=WpfApplication212">

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

<Style TargetType="{x:Type local:URComboBox}" BasedOn="{StaticResource ComboBoxStyle}">
</Style>

Это работает, но если я комментирую ResourceDictionary. MergedDictionaries и в коде пробуют это:

ResourceDictionary skin = new ResourceDictionary();
skin.Source = styleLocation;
ResourceDictionary skinFather = new ResourceDictionary();
skinFather.MergedDictionaries.Add(skin);
skinFather.Source = styleLocationFather;

Это повредится, потому что не может найти ресурс.

7
задан Dave Clemmer 15 August 2011 в 16:52
поделиться

1 ответ

Вы не можете использовать свойство Source для загрузки словаря ресурсов из кода.

Из MSDN:

"Объединенные словари могут быть добавлены в словарь ресурсов через код. Изначально пустой словарь ресурсов по умолчанию, который существует для любого свойства Resources, также имеет изначально пустое свойство коллекции MergedDictionaries по умолчанию. Чтобы добавить объединенный словарь с помощью кода, вы получаете ссылку на нужный первичный ResourceDictionary, получаете значение его свойства MergedDictionaries и вызываете Add для общей коллекции, которая содержится в MergedDictionaries. Добавляемый объект должен быть новым ResourceDictionary. В коде вы не устанавливаете свойство Source. Вместо этого вы должны получить объект ResourceDictionary, либо создав его, либо загрузив. Одним из способов загрузки существующего ResourceDictionary является вызов XamlReader.Load на существующем потоке файлов XAML, который имеет корень ResourceDictionary, а затем приведение возвращаемого значения XamlReader.Load к ResourceDictionary. "

Отсюда немного псевдокода:

ResourceDictionary myResourceDictionary = XamlReader.Load(someXamlStreamReader);
anotherResourceDictionary.MergedDictionaries.Add(myResourceDictionary);

Вот еще один пример того, как это сделать:

Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
8
ответ дан 7 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: