Вы можете написать класс ApplicationDictionaryMerger
, который принимает словари в качестве своего содержимого и добавляет их в MergedDictionaries
приложения, например:
[ContentProperty("Dictionaries")]
public class ApplicationDictionaryMerger
{
private readonly ObservableCollection<ResourceDictionary> dictionaries =
new ObservableCollection<ResourceDictionary>();
public ApplicationDictionaryMerger()
{
this.dictionaries.CollectionChanged += this.DictionariesChanged;
}
private void DictionariesChanged(object sender,
NotifyCollectionChangedEventArgs e)
{
// Do whatever you deem appropriate here to get the MergedDictionaries
var applicationDictionaries =
Application.Current.Resources.MergedDictionaries;
// Enhance this switch statement if you require more functionality
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (var dict in e.NewItems)
{
applicationDictionaries.Add((ResourceDictionary)dict);
}
break;
}
}
public IList Dictionaries
{
get { return this.dictionaries; }
}
}
Единственный улов - это то, что вам нужносоздание экземпляра объекта, подобного описанному выше, из XAML.
Изначально я думал, что добавление его в раздел Resources
любого элемента управления в вашем XAML будет хорошо, но затем оказывается, что загрузчик XAML не создает экземпляры ресурсовкоторые не используются.Поэтому я нашел другой обходной путь: установив объект в качестве значения свойства Tag
любого элемента управления.
Мне было бы очень интересно узнать, есть ли лучший способ убедиться, что ApplicationDictionaryMerger
создается.
Вот как его использовать:
<Grid> <!-- can also be any other control -->
<Grid.Tag>
<sandbox:ApplicationDictionaryMerger>
<ResourceDictionary>
<!-- add all resources you need here -->
</ResourceDictionary>
<!-- you can also add more dictionaries here -->
</sandbox:ApplicationDictionaryMerger>
</Grid.Tag>
</Grid>