Как удалить эффект наведения мыши по умолчанию на кнопках WPF?

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

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


person Nellius    schedule 04.10.2010    source источник


Ответы (8)


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

person Mark Heath    schedule 04.10.2010
comment
Спасибо, это было идеально. Это оказалось сложнее, чем я думал, но теперь все работает хорошо. - person Nellius; 04.10.2010
comment
По какой-то причине есть 100 ответов о создании пользовательских шаблонов для элементов управления WPF, и все они излишне ошибочны. Нет причин мучиться, чтобы написать 50 строк кода шаблона для кнопки, чтобы изменить 1 вещь. Все, что вам нужно сделать, это в дизайнере xaml щелкнуть правой кнопкой мыши элемент управления и создать копию кода шаблона. VS создаст стиль именно для этой кнопки, и вы сможете настроить его оттуда. Занимает буквально 2 секунды. - person The Muffin Man; 21.10.2017
comment
@TheMuffinMan Фантастика, но не находите ли вы хотя бы немного странным, что требуется 50 строк кода шаблона, чтобы не дать кнопке изменить цвет фона при наведении курсора мыши? Какая глупо сложная структура WPF. - person Ash; 21.09.2020
comment
@Ash Или можно утверждать, что это направляет пользователя в том направлении, в котором он должен идти. Если у вас есть кнопка, для которой требуется новое состояние наведения, скорее всего, это новый ТИП кнопки; возможно, кнопка навигации, кнопка в трее и т. д. Если это так, вам не следует изменять для нее одноразовые свойства, она должна иметь свой собственный элемент управления или группу стилей. И это то, что это заставляет вас делать. - person Matt Kenefick; 06.10.2020
comment
@TheMuffinMan: ты действительно мужчина! 10 лет работы с WPF и только что узнал о опции «Редактировать шаблон»! - person Paul; 12.12.2020
comment
Хорошо, что мне не нужно самому искать эти шаблоны в C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.18362.0\Generic\generic.xaml Лучший совет! - person Slion; 01.02.2021

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

Например, стиль можно вставить в раздел 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>
person dodgy_coder    schedule 15.11.2010
comment
Мне очень нравится это решение. Однако триггеры наведения мыши активируются только тогда, когда мышь находится над текстом на кнопке. Я добавил текстовый блок с указанной шириной внутри кнопки, чтобы решить эту проблему. - person Dave; 27.01.2016
comment
Вы, сэр, святой. - person krobelusmeetsyndra; 21.10.2020

Просто чтобы добавить очень простое решение, которое было достаточно хорошим для меня, и я думаю решает проблему ОП. Я использовал решение в этом ответе, за исключением того, что вместо изображения использовалось обычное значение 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 любым предпочтительным значением.

person Lyall    schedule 02.06.2016

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

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

  • Щелкните правой кнопкой мыши элемент управления
  • Выберите Редактировать шаблон => Редактировать копию...
  • I selected 'Application' for where to save the style
    • From here you can directly edit App.xaml and see the intuitively named properties. For my purposes, I just set RenderMouseOver="False"
  • Затем в файле MainWindow.xaml или любом другом графическом интерфейсе вы можете вставить новый стиль в конец тега Button, например ... Style="{DynamicResource MouseOverNonDefault}"/>
person Benji-Man    schedule 17.11.2017
comment
Кто такой Маффинмен? - person Mike W; 18.11.2017
comment
РЖУ НЕ МОГУ. Он сделал второй ответ на вопрос-владелец-принятый ответ. Не понял, серьезно ты спрашиваешь или шутишь. Трудно сказать по такому имени, как Маффин Мэн. - person Benji-Man; 18.11.2017

Эта ссылка мне очень помогла http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/

Определите стиль в UserControl.Resources или Window.Resources.

 <Window.Resources>
        <Style x:Key="MyButton" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Opacity" Value="0.8" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

Затем добавьте стиль к кнопке следующим образом: Style="{StaticResource MyButton}"

<Button Name="btnSecond" Width="350" Height="120" Margin="15" Style="{StaticResource MyButton}">
    <Button.Background>
        <ImageBrush ImageSource="/Remove_Default_Button_Effect;component/Images/WithStyle.jpg"></ImageBrush>
    </Button.Background>
</Button>
person Arash.Zandi    schedule 11.11.2019

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

Вы можете создать 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>
person Prateek Rai    schedule 14.08.2014

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

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

        <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" />

person stoj    schedule 18.06.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>
person Laine Mikael    schedule 07.10.2015