我目前正在尝试学习WPF,并通过使用样式来使默认的.Net控件看起来不同。虽然所有下面的代码都是WPF标记,但我选择使用C#作为首选语言。
今天我设置了新主题的gmail(请参见下面的图片),因此给自己设定了一个挑战:是否可以在WPF中实现。
我已经成功创建了中间的按钮Spam
,通过使用带有控件模板和触发器的样式。
左侧和右侧的按钮非常相似,但只有两个区别。它们的角半径为1,左侧或右侧的边距为15,而中间按钮将它们都设置为0。
问题!
Q1. 与其复制整个样式并仅更改这两个属性,是否可以通过某种继承方式完成?右侧和左侧的按钮基于现有样式,但进行了这两个可视化更改。我已经尝试使用BasedOn属性创建新样式,但无法编辑所需的属性。
Q2. 样式是解决WPF中此问题的正确方法吗? 在WinForms中,您将尝试创建自定义控件,该控件具有与枚举关联的可见属性,即单击按钮后,样式选项可能是Left、Middle、Right。
Q3. 最难的问题在最后。是否可以这样做:如果一个按钮应用了我的样式,则当您将其背景颜色设置为蓝色时,按钮仍保持渐变,但现在它们不是浅白色,而是一种蓝色。即背景线性渐变刷子是基于而不是覆盖已应用于按钮的背景颜色。还是需要定义不同的样式。个人而言,我无法想象在没有某种代码后台的情况下,如何通过WPF标记从单个刷子创建渐变刷子。
例如,下面是一个蓝色按钮和一个灰色/正常按钮:
MyStyle
<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>
顺便提一句,如果您在上述WPF中发现任何初学者常犯的错误,请随时指出。