我正在尝试为按钮创建一个模板,我可以在表单上反复使用。
Button
,我希望它包含一个Grid
,其中包含两行,并在底行中包含一个自定义文本。
这是我到目前为止所做的,但我不认为这是正确的,因为我想在按钮元素中设置文本。
<ControlTemplate TargetType="Control">
<Grid Width="444">
<Grid.RowDefinitions>
<RowDefinition Height="51" />
<RowDefinition Height="36" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="#286c97"></Grid>
<Grid Grid.Row="1" Background="#5898c0">
<TextBlock Grid.Row="1" FontFamily="Segoe UI" FontSize="12" Text="{TemplateBinding Content}" />
</Grid>
</Grid>
</ControlTemplate>
然后打电话给我希望我能去的模板:
<Button Content="This is the text" />
但遗憾的是,这不起作用。我是否应该使用其他模板将文本值传递给它?
答案 0 :(得分:2)
为了使其有效,有一个名为ContentPresenter
的控件。将其放在模板内的任何位置。但请记住,它可能是任何内容,文本,图像或一堆其他控件,而您的Button
和ControlTemplate都不应该关心它是什么。
ControlTemplate TargetType="Control">
<Grid Width="444">
<Grid.RowDefinitions>
<RowDefinition Height="51" />
<RowDefinition Height="36" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="#286c97"></Grid>
<Grid Grid.Row="1" Background="#5898c0">
<ContentPresenter/>
</Grid>
</Grid>
</ControlTemplate>
ContentPresenter
在ContentControl
内使用时,与按钮一样,会自动附加到模板化父级的Content
,ContentTemplate
和ContentTemplateSelector
属性
现在,如果您想要显示的不仅仅是文字,或想要更多地自定义文字,只需将DataTemplate
作为ContentTemplate
直接传递给特定按钮。
<DataTemplate x:Key="myButtonContentTemplate">
<TextBlock FontSize="18" Text="{Binding}"/>
</DataTemplate>
<Button ContentTemplate="{StaticResource myButtonContentTemplate}"/>