WPF引入控件模板

控件模板基础

需求

需求:客户对目前的控件样式不满意,需要修改样式。

每一个控件都有Template属性,可以定制样式。

我下面以Button为例子:

<Button Content="Button" Height="30" Width="100">
  <Button.Template>
    <ControlTemplate>
      <Border BorderBrush="Orange" BorderThickness="2" CornerRadius="10">
        <TextBlock Text="Button" HorizontalAlignment="Center" VerticalAlignment="Center"/>
      </Border>
    </ControlTemplate>
  </Button.Template>
</Button>

这里了利用模版修改了圆角,直接操作Button属性是没有的

当把Template单独拎出来的时候,需要指定TargetType属性,确实目标控件,和Key属性,方便调用

属性传值

利用TemplateBinding 来绑定控件中的值,如果不写TemplateBinding,只写值的话,控件中设置则是没有效果的。

<ControlTemplate x:Key="btnDemoTemplate" TargetType="Button">
    <Border BorderBrush="Orange" BorderThickness="2" 
            Background="{TemplateBinding Background}" CornerRadius="10">
        <TextBlock Text="Button" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
</ControlTemplate>

TemplateBinding 绑定使用的属性 默认的属性

ControlTemplate:需要指定:TargetType 否则绑定会出现问题 不存在

如果是复杂类型,需要使用ContentPresenter 占位

属性传递:用一个无关大雅的属性可以给ControlTemplate 传值

样式包含模板 但是不必须

引入ContentPresenter

如果Content是复杂类型,则不可以使用TextBlock,需要使用ContentPresenter来占位,进行显示。

<ControlTemplate x:Key="btnDemoTemplate" TargetType="Button">
    <Border BorderBrush="Orange" BorderThickness="2" Background="{TemplateBinding Background}" CornerRadius="10">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
</ControlTemplate>

Style 和 Template

如果样式中有触发器,模版中也有触发器,优先使用模板的触发器。

<ControlTemplate x:Key="btnDemoTemplate" TargetType="Button">
    <Border BorderBrush="Orange" 
            BorderThickness="2" 
            Background="{TemplateBinding Background}" 
            CornerRadius="10"
            x:Name="border">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border" Property="Background" Value="Green"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="Button">
    <Setter Property="Template" Value="{StaticResource btnDemoTemplate}" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Black"/>
        </Trigger>
    </Style.Triggers>
</Style>

我鼠标放上的时候,颜色只会变绿色,不会触发Style中的触发器。

扩展:

如果说,我们想要按钮上有两个部分显示,一个是Content,另外一个要字体图标,请问怎么实现?

利用无关紧要的属性,进行值传递 例如:Tag

<ControlTemplate x:Key="btnDemoTemplate" TargetType="Button">
    <Border BorderBrush="Orange" 
            BorderThickness="2" 
            Background="{TemplateBinding Background}" 
            CornerRadius="10"
            x:Name="border">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="30" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <TextBlock Text="{TemplateBinding Tag}" />
            <ContentPresenter Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border" Property="Background" Value="Green"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="Button">
    <Setter Property="Template" Value="{StaticResource btnDemoTemplate}" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Black"/>
        </Trigger>
    </Style.Triggers>
</Style>
<!--加入A就是想要的图标-->
<Button Height="30" Background="Red" Tag="A" Width="100" Template="{StaticResource btnDemoTemplate}">
    <Button.Content>
        <Button Content="CeShi" />
    </Button.Content>
</Button>

效果如下:

注意:TextBlock 和 Border 都是最基础的控件,基于DrawingRect 和 DrawingContext 绘制,不可以模板开发

相关推荐

  1. WPF模板

    2024-07-12 16:34:05       35 阅读
  2. WPF之自定义模版

    2024-07-12 16:34:05       28 阅读
  3. C#--WPF自定义模板示例

    2024-07-12 16:34:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 16:34:05       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 16:34:05       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 16:34:05       62 阅读
  4. Python语言-面向对象

    2024-07-12 16:34:05       72 阅读

热门阅读

  1. C++ 识别 .lua文件内用户自定义的全局函数

    2024-07-12 16:34:05       23 阅读
  2. 临终护理:用爱与关怀陪伴生命的最后旅程

    2024-07-12 16:34:05       24 阅读
  3. Feign的远程调用

    2024-07-12 16:34:05       21 阅读
  4. 大数据平台之HDFS

    2024-07-12 16:34:05       26 阅读
  5. 笔记:Entity Framework Core 数据库迁移add-migration

    2024-07-12 16:34:05       27 阅读
  6. 数据库系统中的Undo和Redo

    2024-07-12 16:34:05       26 阅读
  7. 写一个垃圾邮件二分类代码

    2024-07-12 16:34:05       25 阅读
  8. Sklearn 深入教程

    2024-07-12 16:34:05       26 阅读
  9. 深度解析:scikit-learn Pipeline记忆功能的秘密

    2024-07-12 16:34:05       26 阅读
  10. 由跨域引发一些思考

    2024-07-12 16:34:05       23 阅读
  11. 【AI研发工具包】sklearn教程(Scikit-learn)

    2024-07-12 16:34:05       25 阅读
  12. sklearn-learn的安装

    2024-07-12 16:34:05       20 阅读