以编程方式设置 WPF 按钮样式
Setting WPF Button Style Programmatically
我有以下风格:
<Window.Resources>
<Style x:Key="RoundCorner" TargetType="{x:Type Button}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="0,0,4,4" BorderBrush="black"
BorderThickness="1,0,1,1" >
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="1"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform CenterX="0.5" CenterY="0.5" Angle="270" />
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
我将它设置为这样的按钮
<Button x:Name="btn_bfx" ToolTip="BreakFix" Content="BFX" Click="btn_bfx_Click" Height="30" Width="40" HorizontalContentAlignment="Center" ></Button>
在构造函数中,我将样式设置为:
btn_bfx.Style = this.Resources["RoundCorner"] as Style;
稍后根据某些情况我想更改样式。
代码如下:
Style oldStyle = FindResource("RoundCorner") as Style;
Style newStyle = new Style();
newStyle.BasedOn = oldStyle;
newStyle.TargetType = typeof(Button);
foreach (var setter in oldStyle.Setters.ToList())
{
newStyle.Setters.Add(setter);
}
newStyle.Setters.Add(new Setter(BackgroundProperty, Brushes.CadetBlue));
btn_bfx.Style = newStyle;
newStyle 只是给oldStyle 添加了背景颜色。但这种新风格并没有被应用。我仍然得到没有背景颜色的样式。
这可以在使用数据触发器的样式中无需代码隐藏的情况下完成。如果将数据触发器绑定到表示条件更改的 属性,则使用触发器中的设置器进行更改。例如:
<Button>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="White"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding condition}" Value="True">
<Setter Property="Background" Value="Black"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
对我来说,这比您尝试调整样式的方式更容易、更整洁。它把它全部放在一个地方,而不是一半在 XAML 中,一半在代码后面。
您的样式重写了按钮的 ControlTemplate
,因此不再使用背景颜色。
在ControlTemplate中,像这样给Border添加一个Background属性
<Border CornerRadius="0,0,4,4" BorderBrush="black" BorderThickness="1,0,1,1"
Background="{TemplateBinding Background}">
然后它将选择您设置的任何背景。
我有以下风格:
<Window.Resources>
<Style x:Key="RoundCorner" TargetType="{x:Type Button}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="0,0,4,4" BorderBrush="black"
BorderThickness="1,0,1,1" >
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="1"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform CenterX="0.5" CenterY="0.5" Angle="270" />
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
我将它设置为这样的按钮
<Button x:Name="btn_bfx" ToolTip="BreakFix" Content="BFX" Click="btn_bfx_Click" Height="30" Width="40" HorizontalContentAlignment="Center" ></Button>
在构造函数中,我将样式设置为:
btn_bfx.Style = this.Resources["RoundCorner"] as Style;
稍后根据某些情况我想更改样式。
代码如下:
Style oldStyle = FindResource("RoundCorner") as Style;
Style newStyle = new Style();
newStyle.BasedOn = oldStyle;
newStyle.TargetType = typeof(Button);
foreach (var setter in oldStyle.Setters.ToList())
{
newStyle.Setters.Add(setter);
}
newStyle.Setters.Add(new Setter(BackgroundProperty, Brushes.CadetBlue));
btn_bfx.Style = newStyle;
newStyle 只是给oldStyle 添加了背景颜色。但这种新风格并没有被应用。我仍然得到没有背景颜色的样式。
这可以在使用数据触发器的样式中无需代码隐藏的情况下完成。如果将数据触发器绑定到表示条件更改的 属性,则使用触发器中的设置器进行更改。例如:
<Button>
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="White"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding condition}" Value="True">
<Setter Property="Background" Value="Black"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
对我来说,这比您尝试调整样式的方式更容易、更整洁。它把它全部放在一个地方,而不是一半在 XAML 中,一半在代码后面。
您的样式重写了按钮的 ControlTemplate
,因此不再使用背景颜色。
在ControlTemplate中,像这样给Border添加一个Background属性
<Border CornerRadius="0,0,4,4" BorderBrush="black" BorderThickness="1,0,1,1"
Background="{TemplateBinding Background}">
然后它将选择您设置的任何背景。