从你处理这个问题的方式,感觉就像你从任何一个WinForms或其他GUI库背景的。
关于WPF的许多伟大事情之一是,你可以用声明式方法解决这些问题,方法是定义Button(或任何其他控件)的样式,以实现视觉效果,而无需编写任何实际码!看看下面的按钮声明:
<Button Content="Test">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
这定义了我们一个按钮,并覆盖默认的按钮样式的背景设置为绿色,并定义一个触发器,将背景设置为红色时IsMouseOver是真实的。 IsMouseOver是一个DependencyProperty,因此触发器可以在值发生更改时订阅通知,这就是整个事情的工作方式。
与此代码的障碍是它实际上不会工作!原因是标准的Button有一些更复杂的规则,使它看起来像一个真正的Windows按钮。这可以适用于大多数其他控件或属性,但不适用于按钮背景。为了解决这个问题,我们必须重写Button的ControlTemplate并强制它呈现一个边框,它是我们的Background属性的颜色。这是一个有点太多进入这里,但这个问题解决了这一问题: How do you change Background for a Button MouseOver in WPF?
为您的最终代码:
<Button Content="Test">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
这种造型是什么WPF是专门做。它使您可以为完全基于标记的应用程序构建相当复杂和花哨/交互式的皮肤。您可以将它们存储在主题文件中,并使用它们覆盖应用程序的整个外观。它非常强大,是一种将UI外观与实际功能代码分开的好方法。