• WPF---控件模板(一)


    一、控件模板概述

    控件的外观通过一个ControlTemplate类型的对象确定,该对象指定了组成一个控件的显示的各种视觉元素。

    当WPF创建一个控件时,会创建一个控件类(模板父)的实例,然后实例化通过它的ControlTemplate设定的这个控件的外观树(组成这个控件的内部UI元素)。

    二、开发自定义的简单控件模板

    为了简单起见,我们开发一个简单的Button控件模板。步骤参见以下:

    1)在Window的Resources中定义一个名字为myButtonTemplate的控件模板

    2)在使用StaticResource标记扩展为Button的Template属性赋值

    至此,一个简单的Button的ControlTemplate就算开发好了,但是仔细看图,我们会发现一个问题,我们按钮实际显示的文本信息与我们设定的文本信息是不一致的,这不是我们的预期,就连背景色和Border的颜色也不是我们的预设值,而是使用了模板的默认值,那么我们该如何修改控件模板来达到我们的预期呢?

    三、控件模板之TemplateBinding

    为了达到上述预期的效果,我们可以使用TemplateBinding将控件模板中的属性绑定到控件本身(模板父)。参见以下代码:

    从图中可以看出,现在已经达到了预期的效果。

    为了达到上述同样显示文本的效果,我们也可以使用ContentPresenter。

    四、ContentPresenter对象

    1)ContentPresenter作为一个占位符,用来在模板中指定Content应该放置的位置;

    2)默认情况下,ContentPresenter从模板父(应用控件模板的控件本身)获取实际的内容,然后绑定到自己的Content属性;

    3)为了使用ContentPresenter,我们需要设置ControlTemplate的TargetType属性为模板父的类型。

    使用了ContentPresenter的ControlTemplate参见以下:

    五、触发器

    1)Trigger必须在ControlTemplate.Triggers的节点下;

    2)Triggers集合中可以包含任意数量的Trigger;

    3)一个Trigger可以有任意数量的Setter;

    4)每个Setter中指定三个属性,分别是TargetName、Property和Value

    带有触发器的控件模板参见以下:

    当鼠标移动到按钮上面的时候,按钮和Border和背景色会变成模板中预设的样式。

    附录:代码

     1 <Window x:Class="ControlTemplateDemo1.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6         xmlns:local="clr-namespace:ControlTemplateDemo1"
     7         mc:Ignorable="d"
     8         Title="MainWindow" Height="350" Width="525">
     9     <Window.Resources>
    10         <ControlTemplate x:Key="myButtonTemplate" TargetType="Button">
    11             <Border Background="{TemplateBinding Background}" 
    12                     BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderBrush}" 
    13                     BorderThickness="1"  CornerRadius="3"  Name="border">
    14                 <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
    15             </Border>
    16             <ControlTemplate.Triggers>
    17                 <Trigger Property="IsMouseOver" Value="True">
    18                     <Setter Property="BorderBrush" Value="Red" TargetName="border"/>
    19                     <Setter Property="Background" Value="Silver" TargetName="border"/>
    20                 </Trigger>
    21             </ControlTemplate.Triggers>
    22                 
    23         </ControlTemplate>
    24     </Window.Resources>
    25     <Grid>
    26         <Button Content="Button" Background="Pink" BorderBrush="Green" 
    27                 Template="{StaticResource myButtonTemplate}" Width="60" Height="30" >
    28         </Button>
    29     </Grid>
    30 </Window>
    View Code
  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9791681.html
Copyright © 2020-2023  润新知