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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Вы можете создать DataTemplate для кнопки, которая может иметь TextBlock, а затем вы можете написать Property trigger на свойстве 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>

Ответ 5

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

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

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

Ответ 6

Расширение на 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" />

Ответ 7

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

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