Определение темы ресурсов других объектов в WPF - PullRequest
1 голос
/ 03 августа 2011

Я создаю несколько страниц WPF в приложении для создания форм.Я хочу использовать WPF Themes для моего приложения.Не имея App.xaml (потому что проект является проектом выигрышных форм с WPF ElementHost для отображения форм WPF), я добавил свой словарь ресурсов темы в свою форму следующим образом:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Themes/ExpressionDark.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Это работаетдля всех элементов управления в этой форме, а также некоторых других пользовательских элементов управления WPF, но есть некоторые пользовательские элементы управления, в которых тема не работает.Я обнаружил, что затронутые элементы управления, которые определяют свои собственные ресурсы, например, так:

    <Grid.Resources>
        <Style TargetType="ComboBox">
            <Setter Property="Margin" Value="0 2 5 2" />
        </Style>
    </Grid.Resources>

Кажется, не имеет значения, где находятся ресурсы или что находится в ресурсе.Все, что не указано в ресурсе, блокирует тему для всего, что предназначено для стиля.Я даже попытался перехитрить его, найдя ресурс в словаре:

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Template" Value="{DynamicResource ComboBoxTemplate}" />
</Style>

И изменив мой стиль, чтобы он выглядел так:

    <Grid.Resources>
        <Style TargetType="ComboBox">
            <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
            <Setter Property="SnapsToDevicePixels" Value="true" />
            <Setter Property="Template" Value="{DynamicResource ComboBoxTemplate}" />
            <Setter Property="Margin" Value="0 2 5 2" />
        </Style>
    </Grid.Resources>

Но это вызвало мои поля со спискомисчезнуть полностью!

Есть ли способ добавить ресурсы, которые ограничивают целевые элементы управления, а не выбрасывают тему?

1 Ответ

2 голосов
/ 03 августа 2011

Вам просто нужно установить BasedOn свойство Style на старое неявное Style:

<Grid.Resources>
    <Style x:Key="ComboBoxStyle" 
           TargetType="{x:Type ComboBox}" 
           BasedOn="{StaticResource {x:Type ComboBox}}">
        <Setter Property="Margin" Value="0 2 5 2" />
    </Style>

</Grid.Resources>

редактировать

Итак, если вы не хотите использовать ресурсный ключ на всех ваших ComboBox, вы должны сделать его еще на один шаг вперед. Я не знаю, почему взаимодействие WPF / WinForms так плохо обрабатывает неявные стили, но даже если вы добавите сюда неявный стиль и установите BasedOn="{StaticResource ComboBoxStyle}", вы все равно потеряете свой шаблон.

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

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Themes/ExpressionDark.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <Style x:Key="ComboBoxStyle" 
               TargetType="{x:Type ComboBox}"
               BasedOn="{StaticResource {x:Type ComboBox}}">
            <Setter Property="Margin" Value="0 2 5 2" />
        </Style>
    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type ComboBox}" 
                   BasedOn="{StaticResource ComboBoxStyle}" />
    </Grid.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...