wpf->ControlTemplate

本文介绍了WPF中的ControlTemplate、ContentTemplate和DataTemplate的区别,强调ControlTemplate用于定制控件外观和结构,而DataTemplate则控制数据的呈现方式。通过实例展示了如何使用ControlTemplate改变控件的视觉效果和状态,包括定义样式、触发器等,以实现自定义控件的视觉风格。

首先理清几个概念,Template、ControlTemplate、ContentTemplate、DataTemplate、ContentControl

这几个东西名字都差不多,意思感觉也接近,初次接触真的难以理解,那么现在开始区分了:

1.子类:

  ContentControl是Control的子类,专门用于显示内容的,如常用的Label就是ContentControl的子类

2.属性:

     Template 是Control类的一个属性;

     ContentTemplate是ContentControl的一个属性;

3.类型:

     Control的Template属性是ControlTemplate类型的;

     ContentControl的ContentTemplate属性是DataTemplate类型的;

4.用途:

    ControlTemplate,顾名思义,是控制控件外观和结构的,一般对于某个控件的类型,如一个Button长什么样子,Buttton里有一个列表,列表左侧显示图片等;

    DataTemplate,则是控制一个控件它的数据要如何呈现的,一般对于的是某种数据的类型,(一般是用来修饰其Content属性的),所以要求为该类型的属性赋值,

           如:

                Label的Content属性赋值后,可以设置Label的ContentTemplate;

                ItemsControl的ItemsSource属性赋值后,可以设置其的ItemTemplate;

                HeaderItemsControl的Header属性赋值后,可以设置其的HeaderTemplate;

5.WPF模板类的继承关系

     FrameworkTemplate

     派生出:

           ControlTemplate(决定控件外观)、ItemsPanelTemplate(决定集合的容器)、DataTemplate(决定数据的呈现方式)

         而DateTemplate又派生出 HierarchicalDataTemplate(层次数据模板,一般用于TreeView和Menu)

6.当然这里主要讲ControlTemplate

 ControlTemplate类的作用是重新定义控件的视觉效果和触发状态。控件在获取焦点或者被按下时,一般会显示出不同的状态,以便于用户区分。系统控件的视觉状态都是事先已经设定好的。这样做的好处是,可以复用已有的代码,大大节省了UI界面开发周期。有时候,用户需要为控件设定自己想要的视觉效果,比如:按钮控件的皮肤,指定为自定义的风格。这时,就需要借助ControlTemplate类。以下是一个简单的例子:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!--最小化按钮样式-->
    <Style TargetType="Button" x:Key="MinBtnStyle">
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="ToolTip" Value="最小化"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Image Name="btnImg" Source="/WpfApp1;component/Images/WinButton/Minimize.png" Width="20" Height="20"/>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Source" TargetName="btnImg" Value="/WpfApp1;component/Images/WinButton/Minimize_Hover.png"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Source" TargetName="btnImg" Value="/WpfApp1;component/Images/WinButton/Minimize_Press.png"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
   <Button Style="{StaticResource MinBtnStyle}" />

1:Style有TargetType属性,值为生效的对象控件,x:Key是命名的资源名,Setter的属性名有很多,Cursor大家不陌生,是鼠标移动到上面显示的样子,Hand代表手型,ToolTip指的是鼠标移动到上面显示的提示,类似placeholder,Template是模型,controlTmplate是行为,里面的TargetType和Style的一样,controlTemplateTriggers是个触发器集合,里面有单独的trigger,Trigger的Property是行为,有IsMouseOver和IsPressed等,IsMouseOver顾名思义是鼠标移入移出时触发,IsPressed是鼠标点击时或者松开触发,value为true或者false,对应移入移出或者点击,松开,触发器里面的Setter是设置器,Property是设置的属性名,Source是Image的一个属性,意思是设置图片,TargetName指的是目标名控件名,与x:key相对,value是对应的设置的值。

2:路径,/WpfApp1;component/指的是项目名字为WpfApp1的根目录,component/就是根目录,前面的;隔开,代表项目所在的路径。





<ListView.ContextMenu> <ContextMenu Name="FileContextMenu" Padding="0" UsesItemContainerTemplate="True" Background="#333333" Foreground="White" FontWeight="Bold"> <!-- 分离菜单项和分隔符的样式 --> <ContextMenu.Resources> <!-- 菜单项样式 --> <Style TargetType="{x:Type MenuItem}"> <Setter Property="Padding" Value="10 5 20 5"/> </Style> <!-- 更美观的分隔符样式示例 --> <Style TargetType="{x:Type Separator}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Separator}"> <Border Height="1" Background="#555555" Margin="10 5 10 5" CornerRadius="2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- 在资源中定义自定义菜单样式 --> <Style x:Key="CustomMenuItemStyle" TargetType="{x:Type MenuItem}"> <Setter Property="Background" Value="#333333"/> <Setter Property="Foreground" Value="White"/> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="Padding" Value="10 5 20 5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type MenuItem}"> <!-- 关键修改:重构整个菜单项布局 --> <Grid Background="Transparent"> <Grid.ColumnDefinitions> <!-- 移除图标列 --> <ColumnDefinition Width="Auto" MinWidth="0"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- 左侧渲染区域(完全透明) --> <ContentPresenter Grid.Column="0" ContentSource="Icon" Margin="0" Width="0"/> <!-- 主内容区域 --> <ContentPresenter Grid.Column="1" ContentSource="Header" Margin="0" VerticalAlignment="Center"/> </Grid> <!-- 交互状态 --> <ControlTemplate.Triggers> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" Value="#555555"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ContextMenu.Resources> <MenuItem Header="打开" Click="OpenMenuItem_Click"/> <MenuItem Header="属性" Click="PropertiesMenuItem_Click"/> <Separator/> <MenuItem Header="复制" Click="CopyMenuItem_Click"/> <MenuItem Header="删除" Click="DeleteMenuItem_Click"/> <Separator/> <MenuItem Header="重命名" Click="RenameMenuItem_Click"/> </ContextMenu> </ListView.ContextMenu> c# wpf 优化下拉菜单
11-01
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="36" Height="36" Cursor="Hand"> <Button.Template> <ControlTemplate TargetType="Button"> <Grid> <!-- 背景模糊层 --> <Rectangle x:Name="BackgroundBlur" RadiusX="18" RadiusY="18" Opacity="0.7"> <Rectangle.Fill> <VisualBrush> <VisualBrush.Visual> <!-- 模拟亚克力材质 --> <Grid> <Rectangle Fill="Green"/> <Border Background="#10FFFFFF" CornerRadius="18" BorderBrush="#20FFFFFF" BorderThickness="1"/> </Grid> </VisualBrush.Visual> </VisualBrush> </Rectangle.Fill> <Rectangle.Effect> <BlurEffect Radius="2"/> </Rectangle.Effect> </Rectangle> <!-- 边框高光 --> <Border x:Name="BorderHighlight" CornerRadius="18" BorderThickness="1" BorderBrush="#80FFFFFF" Width="36" Height="36"/> <!-- 内容容器 --> <ContentPresenter x:Name="Content" HorizontalAlignment="Center" VerticalAlignment="Center" TextElement.Foreground="White"/> </Grid> <ControlTemplate.Triggers> <!-- 鼠标悬停效果 --> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="BackgroundBlur" Property="Opacity" Value="0.9"/> <Setter TargetName="BorderHighlight" Property="BorderBrush" Value="#B0FFFFFF"/> </Trigger> <!-- 按下效果 --> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="BackgroundBlur" Property="Opacity" Value="0.5"/> <Setter TargetName="BackgroundBlur" Property="Effect"> <Setter.Value> <BlurEffect Radius="4"/> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> <!-- 使用Segoe Fluent Icons的加号图标 --> <!--<TextBlock Text="" FontFamily="Segoe Fluent Icons" FontSize="14" RenderOptions.ClearTypeHint="Enabled"/>--> </Button>增加修改颜色的属性
05-21
<ListView.ContextMenu> <ContextMenu Name="FileContextMenu" Padding="0" FontSize="18" Background="#333333" Foreground="White" FontWeight="Bold" UsesItemContainerTemplate="True"> <!-- 关键修改:确保资源定义顺序正确 --> <ContextMenu.Resources> <!-- 1. 先定义自定义样式 Value="Transparent" <Setter Property="FontWeight" Value="Bold"/>--> <Style x:Key="CustomMenuItemStyle" TargetType="{x:Type MenuItem}"> <Setter Property="Background" Value="#333333"/> <Setter Property="Foreground" Value="White"/> <Setter Property="Padding" Value="10 5 20 5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type MenuItem}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"> <ContentPresenter ContentSource="Header" VerticalAlignment="Center" Margin="0"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" Value="#555555"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="#777777"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- 2. 再引用自定义样式 --> <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource CustomMenuItemStyle}"/> <!-- 3. 分隔符样式 Height="1" <Border Height="1" Background="#555555" Margin="10 5" CornerRadius="2"/>--> <Style TargetType="{x:Type Separator}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Separator}"> <Grid Height="10" Margin="10 5" Background="Red" /> </ControlTemplate> </Setter.Value> </Setter> <!-- 设置默认高度确保一致 --> <Setter Property="Height" Value="1"/> </Style> </ContextMenu.Resources> <!-- 菜单项定义 --> <MenuItem Header="打开" Click="OpenMenuItem_Click"/> <MenuItem Header="属性" Click="PropertiesMenuItem_Click"/> <Separator /> <MenuItem Header="复制" Click="CopyMenuItem_Click"/> <MenuItem Header="删除" Click="DeleteMenuItem_Click"/> <Separator/> <MenuItem Header="重命名" Click="RenameMenuItem_Click"/> </ContextMenu> </ListView.ContextMenu> 分割线style 修改没有反馈 左右粗细不一致,左边粗,右边细。我需要俩边粗细一致
最新发布
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值