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