如何:替换 TextBox 的默认内容宿主
更新:2007 年 11 月
此示例演示如何使用 Windows Presentation Foundation (WPF) 样式来替换 TextBox 的默认内容宿主。
内容宿主 是用来呈现 TextBox 内容的元素。 TextBox 的默认控件模板将 ScrollViewer 指定为内容宿主。 有关 TextBox 的默认控件模板的示例,请参见 TextBox ControlTemplate 示例。
如果由 ScrollViewer 提供的滚动功能是不想要或不需要的,则可以将轻量 AdornerDecorator 元素指定为 TextBox 的内容宿主。
有关用来对此示例进行演示的工作示例,请参见替换 TextBox 的默认内容宿主的示例。
示例
TextBox 的 ControlTemplate 必须仅包含一个标记为内容宿主元素的元素。若要将某个元素标记为内容宿主,应为它指定特殊名称 PART_ContentHost。内容宿主元素必须为 ScrollViewer 或 AdornerDecorator。内容宿主元素可能不会承载任何子元素。
下面的可扩展应用程序标记语言 (XAML) 示例所定义的样式用来重写 TextBox 的默认控件模板。 此样式与从 TextBoxBase 继承的元素兼容。 在本示例中,AdornerDecorator 指定为内容宿主。
<Window.Resources>
<Style x:Key="TextBoxNoScrollViewer" TargetType="{x:Type TextBoxBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border
CornerRadius="2"
Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
>
<!--
The control template for a TextBox or RichTextBox must
include an element tagged as the content host. An element is
tagged as the content host element when it has the special name
PART_ContentHost. The content host element must be a ScrollViewer,
or an element that derives from Decorator.
-->
<AdornerDecorator
x:Name="PART_ContentHost"
Focusable="False"
/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
下面的 XAML 示例通过结合使用 Style 属性和对样式的 x:Key 属性 的静态资源引用,来定义一个采用以前所声明样式的 TextBox。
<TextBox
Grid.Column="0"
AcceptsReturn="True"
AcceptsTab="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
Style="{StaticResource TextBoxNoScrollViewer}"
>
TextBox styled not to use a ScrollViewer as the content host.
</TextBox>