Переопределить ресурсы словаря ресурсов Generic.xaml из другого проекта в том же решении

У меня есть решение, в котором у меня есть проект приложения для Windows Phone и ClassLibrary, который сам по себе имеет TemplatedControl.cs чей стиль по умолчанию указан в Словаре ресурсов ClassLibrary/Themes/Generic.xaml.

- MySolution
    - WPApp_Project
        - MainPage.xaml/MainPage.xaml.cs
        - App.xaml/App.xaml.cs

    - ClassLibrary_Project
        - Themes
            - Generic.xaml
        - View
            - TemplatedControl.cs
        - ViewModel
            - TemplatedViewModel.cs
            - ViewModelLocator.cs

Например, я определил это в файле Generic.xaml:

<SolidColorBrush x:Key="MyBrush" Color="Gold"/>

Как я могу из моего WP App изменить значение этого SolidColorBrush в той степени, что это влияет на каждый элемент в моей ClassLibrary, которая использует этот ресурс?

2 ответа

Решение

Мне удалось найти способ сделать это. Так как у меня есть TemplatedViewModel.cs со свойствами, прикрепленными к нему в моем Generic.xaml Я в основном создал дополнительные свойства для вещей, которые я хочу изменить, то есть, если я хочу изменить цвет TextBlock, я добавлю следующее в свой Generic.xaml:

<TextBlock Content="I am a TextBlock" Foreground="{Binding Path=HappyColor}" />

И в моем WPApp я получаю экземпляр моего TemplatedViewModel.cs и установите его на новый цвет:

TemplatedViewModel viewModel = ViewModelLocator.TemplatedStatic;
viewModel.HappyColor = "#00FF00";

В идеале я хотел бы иметь возможность устанавливать свойства в ResourceDictionary в XAML, однако я не смог. Поэтому в течение следующих нескольких дней, если кто-то может сказать мне, как это сделать, я отмечу его ответ как ответ.

Вам просто нужно переопределить x:Key другим значением ПОСЛЕ того, как общее значение уже загружено. Вы можете сделать это, динамически загружая файлы ресурсов, которые содержат ваши ключи, которые вы хотите переопределить.

Для динамической загрузки словарей ресурсов XAML вы можете сделать что-то вроде этого:

Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("pack://application:,,,/WPF.Common.UI;component/Resources/Dictionaries/ApplicationResourceDictionary.xaml") });
Другие вопросы по тегам