我目前正在尝试学习 WPF,并希望通过使用样式来使默认的 .Net 控件看起来不同。尽管下面的所有代码都是 WPF 标记,但使用 C# 作为我的首选语言。
我今天用新主题设置了 gmail,(见下图),从而为自己设定了挑战,可以在 WPF 中完成。
我设法实现的是Spam
通过使用带有控件模板和触发器的样式来创建中间按钮。
左右按钮非常相似,但只有 2 处不同。它们在左侧或右侧的角半径为 1,边距为 15,而中间按钮将它们都设置为 0。
问题!
Q1。与其复制整个样式并仅更改这两个属性,不如通过某种类型的继承来完成。左右按钮的位置基于现有样式,但它使这两个视觉变化。创建新样式时我已经尝试过 BasedOn 属性,但无法编辑所需的属性。
Q2。样式是在 WPF 中解决此问题的正确方法吗?在 WinForms 中,您将希望创建一个自定义控件,该控件具有链接到枚举的可见属性,即您单击按钮,样式选项可能是左、中、右。
Q3。直到最后一个最难的问题。是否有可能做到,所以如果一个按钮应用了我的样式。然后,当您将其背景颜色设置为蓝色时。然后按钮保持渐变,但不是灰白色,而是蓝色阴影。即背景线性渐变画笔基于,而不是覆盖已应用于按钮的背景颜色。或者这些是否需要定义单独的样式。如果没有某种类型的代码,我个人无法看到这是可以实现的,即从 WPF 标记中的单个画笔制作渐变画笔。
即按钮如下一个蓝色按钮和一个灰色/正常按钮
我的风格
<Style x:Key="GoogleMiddleButton" TargetType="{x:Type Button}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="#F1F1F1" Offset="0"/>
<GradientStop Color="#F5F5F5" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="#666666"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="dropShadowBorder"
BorderThickness="0,0,0,1"
CornerRadius="1"
>
<Border.BorderBrush>
<SolidColorBrush Color="#00000000"/>
</Border.BorderBrush>
<Border Name="border"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
CornerRadius="0"
Background="{TemplateBinding Background}">
<Border.BorderBrush>
<SolidColorBrush Color="#D8D8D8"/>
</Border.BorderBrush>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="border">
<Setter.Value>
<SolidColorBrush Color="#939393"/>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" TargetName="dropShadowBorder">
<Setter.Value>
<SolidColorBrush Color="#EBEBEB"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#333333"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="#F1F1F1" Offset="1"/>
<GradientStop Color="#F5F5F5" Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
ps 如果您在上面的 WPF 中发现任何初学者错误,请随时向我指出。