Набор триггеров в стиле не работает должным образом - PullRequest
0 голосов
/ 10 февраля 2020

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

    <Style TargetType="{x:Type Button}" x:Key="tkButton">
    <Setter Property="Background" Value="{StaticResource exQuiteDarkBrush}"/>
    <Setter Property="Foreground" Value="{StaticResource tkLightGrayBrush}"/>
    <Setter Property="FontFamily" Value="{StaticResource TKTypeRegular}"/>
    <Setter Property="BorderBrush" Value="{StaticResource tkMediumGrayBrush}"/>
    <Setter Property="MinHeight" Value="25"/>
    <Setter Property="MinWidth" Value="60"/>
    <Setter Property="Margin" Value="2"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="{StaticResource tkBrandBlueBrush}"/>
            <Setter Property="Foreground" Value="{StaticResource tkBrandBlueBrush}"/>            
            </Trigger>
        <Trigger Property="UIElement.IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{StaticResource tkMediumGrayBrush}"/>
            <Setter Property="BorderBrush" Value="{StaticResource tkDarkGrayBrush}"/>
        </Trigger>
    </Style.Triggers>
</Style>

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

<Button Style="{DynamicResource tkButton}" Content="button with ITALIC and BOLD type" FontStyle="Italic" FontWeight="Bold" IsEnabled="{Binding Enabled}"/>
<Button BorderBrush="{StaticResource tkRedBrush}" Style="{DynamicResource tkButton}" Content="button with ITALIC type" FontStyle="Italic" IsEnabled="{Binding Enabled}"/>

Первая кнопка добавляет стиль и работает, как и ожидалось, при наведении на него курсора. Второй использует стиль, но меняет BorderBrush на красный. При наведении курсора на вторую кнопку я ожидаю изменить BorderBrush, но он останется красным.

Единственное решение, которое я могу себе представить, - снова установить триггер внутри окна / приложения. Существуют ли другие решения для изменения этого поведения?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вы можете попытаться объявить свою кнопку следующим образом, унаследовав стиль tkButton и переопределив значение BorderBrush, поскольку BorderBrush="{StaticResource tkRedBrush}" имеет более высокий приоритет, чем объявление стиля

<Button Content="button with ITALIC type" FontStyle="Italic" IsEnabled="{Binding Enabled}">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource tkButton}">
            <Setter Property="BorderBrush" Value="{StaticResource tkRedBrush}"/>
        </Style>
    </Button.Style>
</Button>
1 голос
/ 10 февраля 2020

Переместите триггер на ControlTemplate:

<ControlTemplate TargetType="{x:Type Button}">
    <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource tkBrandBlueBrush}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Если вы введете его в Style, локальное значение, указанное BorderBrush="{StaticResource tkRedBrush}", будет иметь приоритет над значением, установленным Setter : https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-property-value-precedence

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...