WPF控件模板

前言

WPF中每个控件都被设计为无外观的,这意味着我们可以通过一定的方式,完全重定义其可视化外观,而WPF也提供了这种改变外观的方式之一,我们称为模板。wpf的模板有多种方式,可以分为控件模板(ControlTemplate),控件列表模板(ItemsPanelTemplate)和数据模板(DataTemplate)。其中ControlTemplate和ItemsPanelTemplate都属于控件模板,但又有不同的表示。

控件模板使用示例

假设现在需要一个如下要求的按钮:

image-20210627232821835

实现的方式可能有很多种,这里使用控件模板演示一下

<Button
                Width="100"
                Height="35"
                Margin="0,10"
                Background="#557BF6"
                BorderThickness="0"
                Foreground="White">
                <Button.Template>
                    <ControlTemplate>
                        <Border Background="#557BF6" CornerRadius="5">
                            <StackPanel
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                Orientation="Horizontal">
                                <TextBlock Text="❤ " />
                                <TextBlock Text="按钮2" />
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Button.Template>
            </Button>

如果把样式和模板全部写在单个控件里面,看起来会让人很抓狂,则可以使用前面提到的自定义样式,把这些公共的东西抽出来,改造后的代码如下:

<ControlTemplate x:Key="btnTempleteStyle" TargetType="{x:Type Button}">
            <Border Background="#557BF6" CornerRadius="5">
                <StackPanel
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Orientation="Horizontal">
                    <TextBlock Foreground="White" Text="❤ " />
                    <ContentPresenter />
                </StackPanel>
            </Border>
        </ControlTemplate>
<Button
                Width="100"
                Height="35"
                Content="按钮1"
                Foreground="White"
                Template="{StaticResource btnTempleteStyle}" />

如果遇到复杂一点的控件,或者我们对某个控件属性不熟悉时,则可以通过实时可视化树去生成副本,然后在此基础上改

找到需要修改的控件,右键点击编辑模板

微信截图_20210627201247

随后就会自动生成一大段代码

微信截图_20210627202047

可以把不相关或你不想要的全部去掉,也可在此基础上修改

微信截图_20210627233817

示例源代码

源代码:https://github.com/luchong0813/WPFSeriesJobs/tree/master/3-ControlTemplete

原文地址:https://www.cnblogs.com/chonglu/p/14942758.html