Слияние ресурсов словарей - PullRequest
7 голосов
/ 12 апреля 2010

Я пытаюсь объединить словари ресурсов 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;

Это сломается, потому что не могу найти ресурс.

1 Ответ

8 голосов
/ 23 июня 2010

Нельзя использовать свойство Source для загрузки словаря ресурсов из кода.

С MSDN :

"Объединенные словари могут быть добавлены в словарь ресурсов с помощью кода. По умолчанию, изначально пустой ResourceDictionary, который существует для любого свойства ресурсов, также имеет свойство по умолчанию, изначально пустое свойство коллекции 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);
...