Триггер наведения мыши не работает после программного изменения цвета фона - PullRequest
0 голосов
/ 13 марта 2020

У меня есть проект, в котором я ввел триггер для кнопки, которая меняла цвет фона кнопки, когда мышь наводит на нее курсор.

Вот как это выглядит:

<Window.Resources>
    <Style x:Key="ButtonStyleDefault" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="White"/>
        <Setter Property="Margin" Value="1.8"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="IsTabStop" Value="False"/>
        <Setter Property="FontWeight" Value="DemiBold"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="DarkGray">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="LightGray"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

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

Эта функция отвечает за применение этого эффекта к кнопке

private async void HandleButtonEffects(Button button)
{
    if (button is null) {
        return;
    }

    button.Background = new SolidColorBrush(Colors.LightGray); 
    await Task.Delay(80)
            .ConfigureAwait(true);
    button.Background = new SolidColorBrush(Colors.LightGray);
}

Это тоже отлично работает. Проблема в том, что триггер перестает работать и зависание кнопки не будет иметь никакого эффекта. Я предполагаю, что триггер каким-то образом является дочерним по отношению к свойству Background, и, переопределяя его, я также переопределяю триггер.

Я мог бы получить производные от кнопки и создать функцию publi c что имитирует зависание и вызывает это из функции HandleButtoneEffect? Но я бы хотел как можно больше этого избежать

Как мне решить эту проблему?

1 Ответ

3 голосов
/ 13 марта 2020

button.Background = new SolidColorBrush(Colors.LightGray); - эта строка назначает локальное значение свойству зависимости. Локальное значение имеет высокий приоритет , и триггер не может его переопределить.

Вы можете вызвать ClearValue для восстановления эффекта стиля:

private async void HandleButtonEffects(Button button)
{
    if (button is null)
    {
        return;
    }

    button.Background = new SolidColorBrush(Colors.LightGray);
    await Task.Delay(80).ConfigureAwait(true);
    button.ClearValue(Button.BackgroundProperty);
}
...