以编程方式设置WPF按钮样式
我有以下风格:以编程方式设置WPF按钮样式,wpf,xaml,resourcedictionary,Wpf,Xaml,Resourcedictionary,我有以下风格: <Window.Resources> <Style x:Key="RoundCorner" TargetType="{x:Type Button}"> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/>
<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>
后来基于某种条件,我想改变一下风格
代码如下:
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;
新闻样式只是在旧样式中添加背景色。但这一新风格并未得到应用。我仍然得到没有背景色的样式。这可以通过使用数据触发器在样式中不使用代码来完成。如果将数据触发器绑定到表示条件更改的属性,则使用触发器中的setter进行更改。例如:
<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中,向边框添加背景属性,如下所示
<Border CornerRadius="0,0,4,4" BorderBrush="black" BorderThickness="1,0,1,1"
Background="{TemplateBinding Background}">
然后,它将拾取您设置的任何背景。不是答案,但如果您也在XAML中定义新样式,那么编写和阅读将比在代码隐藏中容易得多;它也不起作用。这可以在不使用数据触发器的样式中隐藏代码的情况下完成。如果将数据触发器绑定到表示条件更改的属性,则使用触发器中的setter进行更改。Hi。我没有使用MVVM,因为它只是一个简单的1窗口项目,它从用户那里获取一些数据,并通过WEB API更新一些表。我的意图是,通过改变背景颜色,用户将获得他所选选项的视觉反馈。所以在点击按钮时,我试图改变背景颜色。就这样。
<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>
<Border CornerRadius="0,0,4,4" BorderBrush="black" BorderThickness="1,0,1,1"
Background="{TemplateBinding Background}">