Стили WPF на основе родительских стилей - PullRequest
1 голос
/ 29 января 2020

Предположим, у меня есть стиль WPF для элемента контейнера, такого как сетка, который автоматически применяет стили к его дочерним элементам, например:

<Window.Resources>
    <Style TargetType="Grid" x:Key="FormStyle">
        <Style.Resources>
            <Style TargetType="Label">
                <Setter Property="FontSize" Value="50"/>
            </Style>
        </Style.Resources>
    </Style>
</Window.Resources>

Как я могу затем переопределить элементы certian этого стиля в пределах сама сетка? Например, предположим, что я хотел, чтобы одна сетка имела FormStyle, но также имела синюю метку, например так (что не работает):

<!-- this works fine and Label size = 50 -->
<Grid Style="{StaticResource FormStyle}">
    <Label Content="Blah"/>
</Grid>

<!-- But this doesnt, label is blue, but normal font size -->
<Grid Style="{StaticResource FormStyle}">
    <Grid.Resources>
        <Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
            <Setter Property="Foreground" Value="Blue"/>
        </Style>
    </Grid.Resources>
    <Label Content="Blah"/>
</Grid>

Я ожидаю, что BasedOn={StaticResource {x:Type Label}} будет ссылаться на текущий активный стиль для меток. в текущей области видимости - т.е. стиль метки в FormStyle. Но это явно не относится и относится к базовому внешнему стилю меток.

Если я сделаю, например, это глобально

<Style TargetType="Label">
    <Setter Property="FontSize" Value="50"/>
</Style>

Тогда все в порядке.

Я мог бы Конечно, просто назовите стили, но, должно быть, есть более простой / менее подробный способ?

Спасибо

1 Ответ

1 голос
/ 30 января 2020

Вот процесс поиска для Stati c Ресурсы:

  1. Процесс поиска проверяет запрошенный ключ в словаре ресурсов, заданном элементом, который устанавливает свойство.

  2. Затем процесс поиска переходит логическое дерево вверх к родительскому элементу и его словарю ресурсов. Этот процесс продолжается до тех пор, пока не будет достигнут элемент root.

  3. Проверены ресурсы приложения. Ресурсы приложения - это те ресурсы в словаре ресурсов, которые определены объектом приложения для вашего приложения WPF.

В вашем случае для разрешения BasedOn="{StaticResource {x:Type Label}}" WPF сначала просматривает в определенном ResourceDictionary внутри Grid, затем в Window - логическом родителе Grid - и это Resources, и, наконец, в ресурсах уровня приложения. WPF нигде не найдет его - и по умолчанию использует базовый стиль - из-за того, что стиль является вложенным стилем в FormStyle.

Подробнее о Stati c Поведение поиска ресурсов в Docs .

Чтобы получить желаемый результат, вы можете:

1) Переместить свой стиль Label из FormStyle и в Window.Resoruces

2) Объедините стиль Label из FormStyle в стиль Label, определенный в элементе Grid.

<Grid Style="{StaticResource FormStyle}">
    <Grid.Resources>
        <Style TargetType="Label">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontSize" Value="50"/>
        </Style>
    </Grid.Resources>
    <Label Content="Blah"/>
</Grid>

3) Измените ваш FormStyle, чтобы не иметь вложенный стиль для Label, но чтобы сеттеры для свойств Label.

<Window.Resources>
    <Style TargetType="Grid" x:Key="FormStyle">
        <Setter Property="Label.FontSize" Value="50"/>
    </Style>
</Window.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...