默认格式
<Style TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer x:Name="PART_ContentHost"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
解释
- Border: 外部的边框,用于包裹TextBox的内容。其背景色、边框颜色和边框厚度都通过TemplateBinding绑定到TextBox的对应属性。
- ScrollViewer: TextBox内部的滚动查看器,名为PART_ContentHost,用于承载文本内容。滚动条设置为隐藏。
- Triggers: 触发器定义了当某些属性改变时的响应行为。在这里,当IsEnabled属性为False时,设置border的背景色为ControlBrushKey。
自定义模板
<Style TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="2"
CornerRadius="5">
<ScrollViewer x:Name="PART_ContentHost"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
SnapsToDevicePixels="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="Blue" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="Gray" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
解释
- Border: 添加了圆角(CornerRadius)和边框厚度(BorderThickness),从而改变TextBox的外观。
- ScrollViewer: 滚动条的可见性设置为自动(Auto),当内容超出显示范围时会自动显示滚动条。
- Triggers: 增加了一个新触发器,当TextBox获得焦点(IsFocused)时,边框颜色变为蓝色。