I wanted to restyle my buttons to be more flat so I have created two styles; first for ToggleButton
that derives from ToolBar.ToggleButtonStyleKey
and second for Button
that derives from ToolBar.ButtonStyleKey
.
It worked great - the buttons are now toolbar-like and flat. Second thing I wanted is to have Background
property to be transparent when user hovers the cursor over the control. So to achieve that I defined a simple trigger that sets the Background
to Transparent
on IsMouseOver
event. It worked for ToggleButton
, however, the same trigger didn't work for Button
(the background was not affected at all).
Does anyone know why this trigger works great for ToggleButton
and does not work for Button
? I did expect the same behavior since both styles are from the same family.
Below is the full code.
<Window x:Class="WpfButtonsTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="FlatToggleButton" TargetType="ToggleButton"
BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="FlatButton" TargetType="Button"
BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<StackPanel>
<ToggleButton Style="{StaticResource FlatToggleButton}">
I am Toggle Button
</ToggleButton>
<Button Style="{StaticResource FlatButton}">
I am Button
</Button>
</StackPanel>
</Grid>
</Window>
I had a look using Snoop (a very handy program for inspecting WPF ) and it looks like the template which you're using as a basis,
ToolBar.ButtonStyleKey
, has a trigger which selects a solidBrush
for the background of aBorder
element within theButton
(in thise case whenIsMouseOver
is true).Your local style trigger is successfully setting the background of the
Button
element to transparent (or rather, keeping it transparent), but theBorder
background is unaffected, so you'll still see the highlighting behaviour.Border Background:
Button Background:
I think you'll have to define a
ControlTemplate
to get the button you're after, I've grabbed this from one of theToolBar
samples included in Kaxaml (a nice XAML editor). It's a reasonable facsimile of theToolbar
bas button style, with a few bits removed, it may behave as you want, or you might need to tweak it depending on your desired behaviour.I've left the
IsPressed
trigger in place, you may want to remove it, or add additional triggers.