我有一个style
,它在我的C#代码中动态更新。它适用于几个button
和一个border
。通过这种方式,我可以通过简单地设置样式背景属性来更改每个项目的主题。
工作示例
这很好。我最近想在更改背景时也更改鼠标的颜色,所以我实现了以下代码:
Style style = new Style();
// Set background to red
style.Setters.Add(new Setter(Button.BackgroundProperty, new BrushConverter().ConvertFrom("#FF0000") as Brush));
Trigger mouseOver = new Trigger() {
Property = IsMouseOverProperty,
Value = true
};
// Set hover color to green
mouseOver.Setters.Add(new Setter(Button.BackgroundProperty, new BrushConverter().ConvertFrom("#00FF00") as Brush));
style.Triggers.Add(mouseOver);
// Apply style to elements
Application.Current.Resources["menu-color"] = style;
每个项目都成功设置了背景,但只有边框接受鼠标悬停属性。看看下面的gif图。
悬停颜色
我不一定希望边框有悬停的颜色,但这是一个问题。为什么它只适用于该元素而不适用于其他元素?
Xaml内置触发器。因为按钮具有默认的IsMouseOver
样式,所以必须使用样式对其进行自定义
此示例显示按钮上自定义样式的用法。样式可以放置在位于App.xaml
中的<Application.Resources>
中
这也带来了不必创建自定义控件来模仿本机Button控件的好处!
<!-- Apply styling in xaml like so -->
<!-- Note that the x:Key here is what sets the style -->
<Button Style="{StaticResource ButtonStyle}" />
<!-- Add to App.xaml -->
<!-- If an x:key is not set, the styling will apply to all elements that have the given TargetType -->
<Style TargetType="Button" x:Key="ButtonStyle">
<Setter Property="Background" Value="Cyan"/>
<Setter Property="Height" Value="60" />
<!-- Template can be used to take over styling of an element -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}">
<!-- Here goes your custom style if you want one-->
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- This will be 'called' whenever the mouse is over the button -->
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
如果你想看更多的例子,这段代码来自我的GitHub!