Можно ли добавить wpf ResourceDictionary в приложение из файла UserControl xaml? - PullRequest
4 голосов
/ 01 апреля 2011

Можно ли добавить ResourceDictionary на уровне приложения из UserControl xaml.

т.е. сделать то же самое из UserControl XAML, чем следующее в C #:

if (Application.Current == null) new Application();
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() {...});

1 Ответ

1 голос
/ 01 апреля 2011

Вы можете написать класс 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...