创建按钮模板

本文关键字:按钮 创建 | 更新日期: 2023-09-27 18:35:10

我正在尝试为一个按钮创建一个模板,我可以在表单上一遍又一遍地使用。

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" />

但遗憾的是,这行不通。 我应该使用其他模板将文本值传递给它吗?

创建按钮模板

为了使它工作,有一个名为 ContentPresenter 的控件。将其放在模板中您想要的任何位置。但请记住,它可以是任何东西,文本,图像或一堆其他控件,您的Button和控件模板都不应该关心它是什么。

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内使用时,就像按钮一样,会自动附加到模板化父项的ContentContentTemplateContentTemplateSelector属性。

现在,如果您想要显示的不仅仅是文本,或者想要更多地自定义文本,只需将DataTemplate作为您的ContentTemplate直接传递给特定按钮即可。

<DataTemplate x:Key="myButtonContentTemplate">
    <TextBlock FontSize="18" Text="{Binding}"/>
</DataTemplate>
<Button ContentTemplate="{StaticResource myButtonContentTemplate}"/>