Ответ 1
Вам нужно создать свой собственный шаблон кнопки, чтобы иметь полный контроль над внешним видом во всех состояниях. Здесь учебник.
Моя проблема заключается в том, что в WPF всякий раз, когда я пытаюсь изменить цвет фона кнопки с помощью триггеров или анимаций, эффект mouseover по умолчанию (быть серым с этим оранжевым свечением), по-видимому, имеет приоритет.
После обширных поисков я не знаю, как удалить этот эффект.
Вам нужно создать свой собственный шаблон кнопки, чтобы иметь полный контроль над внешним видом во всех состояниях. Здесь учебник.
Это похоже на решение, упомянутое Марк Хит, но с не таким большим количеством кода, чтобы просто создать очень базовую кнопку без встроенной мыши над эффектом анимации. Он сохраняет простую мышь над эффектом отображения границы кнопки в черном. Стиль можно вставить в раздел 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>
Просто для того, чтобы добавить очень простое решение, это было достаточно для меня, и я думаю, что это касается проблемы 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
на любое предпочтительное значение.
Если кто-то не хочет переопределять шаблон управления по умолчанию, то вот решение.
Вы можете создать 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>
У Маффина был очень простой ответ, который сработал у меня.
Чтобы добавить немного более конкретное направление, по крайней мере, для VS 2013:
... Style="{DynamicResource MouseOverNonDefault}"/>
Расширение на dodgy_coder ответ, который добавляет поддержку..
Добавляет поддержку для 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" />
Использование триггера шаблона:
<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>