Как убрать эффект наведения мыши по умолчанию на кнопки WPF? - PullRequest
74 голосов
/ 04 октября 2010

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

После долгих поисков я не знаю, как убрать этот эффект.

Ответы [ 7 ]

98 голосов
/ 15 ноября 2010

Это похоже на решение, упомянутое Марком Хитом, но не так много кода, чтобы просто создать очень простую кнопку, без встроенного эффекта анимации при наведении мыши.Он сохраняет простой эффект наведения мыши на отображение границы кнопки черным цветом.Например, стиль можно вставить в раздел Window.Resources или UserControl.Resources (как показано).

    <UserControl.Resources>
        <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect -->
        <Style x:Key="MyButtonStyle" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" 
                            BorderThickness="1"
                            Padding="4,2" 
                            BorderBrush="DarkGray" 
                            CornerRadius="3" 
                            Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="border" Property="BorderBrush" Value="Black" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

<!-- usage in xaml -->
<Button Style="{StaticResource MyButtonStyle}">Hello!</Button>
20 голосов
/ 02 июня 2016

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

<Style x:Key="SomeButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Никаких повторных шаблонов, кроме того, что Background всегда будет фоном Transparent от шаблонной кнопки - при наведении мыши больше не влияет на фон, как только это будет сделано. Очевидно, замените Transparent любым предпочтительным значением.

16 голосов
/ 04 октября 2010

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

5 голосов
/ 18 ноября 2017

У Маффина был очень простой ответ, который работал для меня.

Чтобы добавить немного более конкретное направление, по крайней мере, для VS 2013:

  • Щелкните правой кнопкой мыши элемент управления
  • Выберите Редактировать шаблон => Редактировать копию ...
  • Я выбрал «Приложение» для сохранения стиля.
    • Отсюда вы можете напрямую редактировать App.xaml и видеть интуитивно названные свойства. Для моих целей я просто установил RenderMouseOver = "False"
  • Затем в MainWindow.xaml или там, где находится ваш графический интерфейс, вы можете вставить новый стиль в конец тега Button, например, ... Style="{DynamicResource MouseOverNonDefault}"/>
3 голосов
/ 14 августа 2014

Если кто-то не хочет переопределять шаблон управления по умолчанию, вот решение.

Вы можете создать DataTemplate для кнопки, которая может иметь TextBlock, а затем вы можете написать триггер свойства в свойстве IsMouseOver, чтобы отключить указатель мыши.эффект.Высота TextBlock и Button должна быть одинаковой.

    <Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20">
                    <Button.ContentTemplate>
                        <DataTemplate>
                            <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Style.Triggers>
                                            <Trigger Property ="IsMouseOver" Value="True">
                                                <Setter Property= "Background" Value="Black"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
                        </DataTemplate>
                    </Button.ContentTemplate>
                </Button>
1 голос
/ 19 июня 2015

Расширение ответа dodgy_coder, которое добавляет поддержку ..

  • Сохранение стиля кнопки WPF
  • Добавляет поддержку IsSelected и hover, то есть переключаемой кнопки

        <Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ButtonBase}">
                        <Border Name="border"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Padding="{TemplateBinding Padding}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" />
                                    <Condition Property="Selector.IsSelected" Value="False" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#FFBEE6FD" />
                            </MultiTrigger>
    
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True" />
                                    <Condition Property="Selector.IsSelected" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="#BB90EE90" />
                            </MultiTrigger>
    
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="False" />
                                    <Condition Property="Selector.IsSelected" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="LightGreen" />
                            </MultiTrigger>
    
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="border" Property="Opacity" Value="0.95" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

примеры ..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />

0 голосов
/ 07 октября 2015

Использование триггера шаблона:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="White"></Setter>
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="White"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...