Объедините Telerik для WPF Theme с моим собственным стилем

В моем приложении WPF у меня есть поле со списком, который меняет темы при изменении выбора:

private void OnThemeSelectionChanged(object sender, SelectionChangedEventArgs args)
    {
        var comboBox = sender as RadComboBox;
        if (sender == null) return;
        switch (comboBox.SelectedIndex)//@TODO - Turn to enum: 0 = Summer and etc 
        {
            case 0:
                SwitchToSummerTheme();
                break;
            case 1:
                SwitchToOffice2016Theme();
                break;
            case 2:
                SwitchToGreenTheme();
                break;
        }
    }

И методы переключения темы выглядят так:

private void SwitchToGreenTheme()
    {
        Application.Current.Resources.MergedDictionaries.Clear();
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Green;component/Themes/Telerik.Windows.Controls.Data.xaml", UriKind.RelativeOrAbsolute)
        });
        AddCommonResources();
    }

То же самое для метода SwitchToOffice2016Theme:

private void SwitchToOffice2016Theme()
    {
        Application.Current.Resources.MergedDictionaries.Clear();
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute)
        });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("/Telerik.Windows.Themes.Office2016;component/Themes/Telerik.Windows.Controls.Data.xaml", UriKind.RelativeOrAbsolute)
        });
        AddCommonResources();
    }

Теперь метод AddCommonResources добавляет мой собственный словарь ресурсов, который будет содержать мой собственный стиль:

 private void AddCommonResources()
    {
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
            Source = new Uri("pack://application:,,,/Common;component/XamlResources/CustomResources.xaml", UriKind.RelativeOrAbsolute)
        });

    }

Теперь, в одном из моих представлений, у меня есть RadRadioButton как следующее:

<telerik:RadRadioButton GroupName="a" x:Name="btn_move"
 Command="{Binding OnMoveCommand}" Content="{DynamicResource MoveString}" 
Grid.Column="5" Margin="5,3" Style="{StaticResource btn_menu_RadRadio}"/>

Теперь я пытаюсь сделать следующее:

<Style x:Key="btn_menu_RadRadio" TargetType="{x:Type telerik:RadRadioButton}"
**BASED ON CURRENT THEME (GREEN/OFFICE2016/SUMMER)** >
    <Setter Property="Padding" Value="1" />
    <Setter Property="FontWeight" Value="SemiBold" />
    <Setter Property="FontSize" Value="20" />
</Style>

Как мне добиться этого на основе поведения? Я имею в виду, у меня нет имени ресурса как:

BasedOn="{StaticResource currentTelerikTheme}"

Как я могу этого достичь? Скажите WPF, чтобы он основывался на текущем стиле Темы Telerik (может быть Green/Office2016/Summer)

1 ответ

Размещая здесь ответ, который я получил от команды Telerik:

Имя зависимости останется неизменным в разных темах Telerik. Следовательно, вам нужно использовать только одно имя ресурса. Чтобы обновить код, чтобы он работал при смене темы, сделайте следующее:

1 - Использовать BasedOn = "{StaticResource RadRadioButtonStyle}"

2 - Измените назначение стиля из StaticResource на DynamicResource

Другие вопросы по тегам