I'm a rank beginner with WPF and I don't even know where to look to find the answer to this question. This XAML seems very straightforward to me:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Button>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
<Button.Content>Test</Button.Content>
</Button>
</Grid>
</Page>
When I mouse over the button, IsMouseOver
changes to True
and the trigger makes background turns green. For an instant. Then it turns blue.
Even better: if I attach the same setter to the IsFocused
property, once I focus on the button the background color throbs between green and blue.
There's something, somewhere in the Button (I'm guessing it's in whatever default theme is being used under Vista) that is making it behave this way. I suspect that there's another property that the trigger needs to set. But what?
Best Answer
You need to change the
Button
'sTemplate
rather than itsStyle
. Built into the template is something called ButtonChrome, and that is what is causing the irritating blue focus effect. Here is a very simple re-templating of theButton
control, taken from the provided Simple Styles:You can see that by re-templating the control, you can change its visual tree. The visual tree in this template is nothing more than a
Border
that contains aContentPresenter
(so you can see the content of the button). I have effectively removed the ButtonChrome from the visual tree this way.