Ответы с форумов MSDN

WPF Изменение цвета кнопки по событию MouseOver

Date: 02.05.2017 15:58:26

Оно должно, и оно действительно остается. Но проблема в том, что стандартный шаблон кнопки имеет свою логику на событие OnMouseOver, которая входит в конфликт с вашей. Поэтому его нужно подправить:

- В конструкторе XAML открывает у кнопки свойства.

- Находим свойство Template

- Правой кнопкой - Извлечь в ресурс

- Находим в шаблоне строку RenderMouseOver="{TemplateBinding UIElement.IsMouseOver} и выпиливаем ее.

Получается как-то так:

<Window x:Class="StylesTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Style.Setters>
                <Setter Property="Button.Background" Value="Black" />
                <Setter Property="Button.Foreground" Value="White" />
                <Setter Property="Button.FontFamily" Value="Verdana" />
                <Setter Property="Button.Margin" Value="10" />
            </Style.Setters>
            <Style.Triggers>

                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="FontSize" Value="14" />
                    <Setter Property="Foreground" Value="Red" />
                    <Setter Property="Background" Value="Yellow" />
                </Trigger>
                <Trigger Property="IsPressed" Value="true">
                    <Setter Property="FontSize" Value="14" />
                    <Setter Property="Foreground" Value="Lime" />
                    <Setter Property="Background" Value="Yellow" />
                </Trigger>
            </Style.Triggers>
        </Style>
        <ControlTemplate x:Key="Template1" TargetType="ButtonBase">
            <my:ButtonChrome Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" Name="Chrome" RenderDefaulted="{TemplateBinding Button.IsDefaulted}" RenderPressed="{TemplateBinding ButtonBase.IsPressed}" SnapsToDevicePixels="True">
                <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" Margin="{TemplateBinding Control.Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" />
            </my:ButtonChrome>
            <ControlTemplate.Triggers>
                <Trigger Property="UIElement.IsKeyboardFocused" Value="True">
                    <Setter Property="my:ButtonChrome.RenderDefaulted" TargetName="Chrome" Value="True" />
                </Trigger>
                <Trigger Property="ToggleButton.IsChecked" Value="True">
                    <Setter Property="my:ButtonChrome.RenderPressed" TargetName="Chrome" Value="True" />
                </Trigger>
                <Trigger Property="UIElement.IsEnabled" Value="False">
                    <Setter Property="Control.Foreground" Value="#FFADADAD" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Window.Resources>
    <StackPanel Background="Black" >
        <Button x:Name="button1" Content="Кнопка 1" Template="{StaticResource Template1}" />
        <Button x:Name="button2" Content="Кнопка 2" />
    </StackPanel>
</Window>

Идея взята отсюда: http://stackoverflow.com/questions/250622/mouseover-highlighting-style-returning-to-default-after-a-second-caused-by-aero




Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub