当前位置: 首页 > news >正文

WPF设计标准学习记录17

在控件中的ControlTemplate的触发器

<Button Content="将ControlTemplate定义在在控件中" 
        Width="280" 
        Height="40" 
        Margin="10" 
        Foreground="#747787">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border x:Name="border" 
                    Background="Transparent" 
                    CornerRadius="5" 
                    BorderThickness="1" 
                    BorderBrush="#C9CCD5">
                <ContentPresenter x:Name="contentPresenter" 
                                  HorizontalAlignment="Center" 
                                  VerticalAlignment="Center"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Content" Value="MouseOver" TargetName="contentPresenter"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="False">
                    <Setter Property="Content" Value="将ControlTemplate定义在在控件中" TargetName="contentPresenter"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>
元素类型 属性名称 属性值/技术说明 核心作用与优化建议
Button Content "将ControlTemplate定义在在控件中" 文本硬编码,建议改用资源绑定{x:Static}
Width 280(固定宽度违反响应式规范,建议MinWidth="260" 企业规范:HIG-2025-UI-003
Height 40(固定高度限制多语言扩展,应启用SizeToContent
Margin 10(统一外边距,推荐分层定义如Margin="5,10"
Foreground #747787(文字颜色未绑定到模板,需通过TemplateBinding传递) 关键缺陷:颜色未生效
Button.Template TargetType Button(限定模板作用域)
ControlTemplate 嵌套结构 定义按钮视觉树(透明背景+动态内容切换)
Border x:Name "border"(命名元素便于触发器操作) 应添加CacheMode="BitmapCache"优化渲染
Background Transparent(透明背景可能影响点击区域检测) 建议改用{x:Null}彻底移除背景层
CornerRadius 5(圆角标准需统一,推荐引用资源CornerRadius.Medium
BorderThickness 1(高DPI屏幕建议采用1.5)
BorderBrush #C9CCD5(浅灰边框,应引用资源BorderSecondary
ContentPresenter x:Name "contentPresenter"(命名便于触发器控制)
HorizontalAlignment Center(内容居中,但未同步TextBlock.TextAlignment
VerticalAlignment Center(符合企业布局规范)
ControlTemplate.Triggers 交互逻辑 通过触发器实现鼠标悬停内容切换 逻辑缺陷:直接修改内容而非样式
Trigger Property IsMouseOver(检测悬停状态)
Value True/False(触发条件)
Setter.TargetName contentPresenter(操作目标元素)
Setter.Property Content(错误操作:应修改样式属性而非内容) 违反MVVM模式
Setter.Value "MouseOver"/原文本(硬编码内容,需改用DynamicResource

关键技术缺陷与改进方案

1. 内容与样式逻辑混淆
<!-- 错误实现:直接修改内容 -->
<Setter Property="Content" Value="MouseOver"/>
 
<!-- 正确方案:修改视觉属性 -->
<Setter TargetName="border" Property="BorderBrush" Value="#4A90E2"/>
<Setter TargetName="contentPresenter" Property="Foreground" Value="White"/>

在Resources定义的ControlTemplate的触发器

<Window.Resources>
    <ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
        <Border Background="#C6D2FC" 
                CornerRadius="5" 
                BorderThickness="1" 
                BorderBrush="#545BAD">
            <ContentPresenter  HorizontalAlignment="Center" 
                               VerticalAlignment="Center"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Width" Value="300"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Width" Value="280"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
 
<Button Content="将ControlTemplate定义在资源中" 
        Template="{StaticResource ButtonTemplate}" 
        Height="40" Margin="10" Foreground="#707CA5"/>
元素类型 属性名称 属性值/技术说明 优化建议与规范参考
Window.Resources 资源容器声明 定义全局可复用的控件模板资源
ControlTemplate x:Key ButtonTemplate(资源键名,需符合大驼峰命名法) 建议分离至独立资源字典Styles.xaml
TargetType Button(限定模板仅适用于按钮控件)
Border Background #C6D2FC(浅蓝色背景,应改用资源引用<

文章转载自:

http://8V4jEnnS.ckcjq.cn
http://6ghGvqK4.ckcjq.cn
http://EEUYDF6i.ckcjq.cn
http://u3K52PWS.ckcjq.cn
http://LaoZIem0.ckcjq.cn
http://Rfe6u5Qy.ckcjq.cn
http://y4Q95RIQ.ckcjq.cn
http://gWzU3guP.ckcjq.cn
http://QyqWdd3A.ckcjq.cn
http://AwghAYiR.ckcjq.cn
http://ZlnKLp8C.ckcjq.cn
http://91FdDXt2.ckcjq.cn
http://O7B9sooV.ckcjq.cn
http://VAGs6gnB.ckcjq.cn
http://Yma4TpFU.ckcjq.cn
http://8XHoqsYr.ckcjq.cn
http://FWwydfgp.ckcjq.cn
http://TjyFYtAq.ckcjq.cn
http://0Wf7wn1d.ckcjq.cn
http://SzoKDy4V.ckcjq.cn
http://KKVfhtgq.ckcjq.cn
http://2UAsdaRC.ckcjq.cn
http://T6tCzUsj.ckcjq.cn
http://nh2jNYTu.ckcjq.cn
http://vkmEWaMi.ckcjq.cn
http://zVCfOAa5.ckcjq.cn
http://U169VQ3M.ckcjq.cn
http://zkhxxHWv.ckcjq.cn
http://A7KFndIj.ckcjq.cn
http://L1qpxmoM.ckcjq.cn
http://www.dtcms.com/a/116491.html

相关文章:

  • 《大模型MCP服务协议与多智能体开发实战10讲》课程大纲
  • 蓝桥杯web工作协调
  • Kafka在Vue和Spring Boot中的使用实例
  • ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射
  • 永磁同步电机控制算法--单电流闭环IF控制
  • Java面试38-Dubbo是如何动态感知服务下线的?
  • 国内虚拟电厂(VPP)管控平台供应商
  • 车载诊断架构 --- 特殊定义NRC处理原理
  • 基于PyQt5与OpenCV的图像处理系统设计与实现
  • 4月7日随笔
  • centos 8 启动Elasticsearch的时候报内存不足问题解决办法
  • 因果推断【Causal Inference】(一)
  • Springboot实现断点续传、分片下载
  • 项目二 - 任务4:等差数列求和
  • 二分 —— 基本算法刷题路程
  • “群芳争艳”:CoreData 4 种方法计算最大值的效率比较(上)
  • Spring Boot 下 MySQL Redis双重复用提高服务器性能
  • 春芽儿智能跳绳:以创新技术引领运动健康新潮流
  • C++(18)—类和对象(下) ③static成员
  • 再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG
  • skynet.dispatch可用的已注册的协议类型
  • 前端开发中的单引号(‘ ‘)、双引号( )和反引号( `)使用
  • 【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)
  • java面向对象练习
  • Linux进程控制(五)之做一个简易的shell
  • 玄机靶场:apache日志分析
  • 4.7-python request库的基本使用
  • 【区块链安全 | 第三十三篇】备忘单
  • 其它理论原则
  • 从存储仓库到智能中枢:AI时代NAS的进化革命