首页 > 编程语言 >【转】[C#][WPF] ContentControl 和 ContentPresenter 的区别

【转】[C#][WPF] ContentControl 和 ContentPresenter 的区别

时间:2024-04-24 10:11:06浏览次数:27  
标签:控件 ContentControl C# ContentPresenter 内容 WPF 模板

转自:阿里的 通义灵码

在 https://blog.csdn.net/yao_hou/article/details/134431366 需要付费阅读,所以从 阿里的 通义灵码 来寻找答案:

WPF 中的 ContentControl 和 ContentPresenter 虽然都涉及内容展示,但它们扮演着不同的角色,具有各自的特性和用途。以下是两者之间的主要区别:

ContentControl

  1. 类型与用途

    • ContentControl 是一个抽象基类,代表了一类可以包含并显示单个内容对象的控件。它继承自 Control 类,是一个完整的用户界面 (UI) 元素,可以直接在应用程序的用户界面上使用或作为其他复合控件的基础。
  2. 内容承载

    • ContentControl 有一个名为 Content 的属性,用于存储要显示的任意类型的对象。它可以是简单的文本、图像、复杂的用户控件,甚至是数据绑定的对象。ContentControl 负责将这个内容对象适当地呈现给用户。
  3. 默认模板与样式

    • ContentControl 有自己的默认模板,该模板通常包含一个 ContentPresenter。当应用默认样式时,ContentControl 会自动使用 ContentPresenter 来显示其 Content 属性所指定的内容。这意味着尽管开发者通常不会直接与 ContentPresenter 交互,但它在幕后参与了内容的呈现过程。
  4. 功能扩展

    • ContentControl 提供了丰富的附加属性和事件,如 ContentTemplateContentTemplateSelectorHeaderHeaderTemplate 等,允许开发者精细控制内容的外观、布局和行为。这些扩展功能使得 ContentControl 可以根据具体需求进行定制,如添加标题、应用数据模板等。

ContentPresenter

  1. 类型与用途

    • ContentPresenter 是一个较低级别的 UI 元素,直接继承自 FrameworkElement。它本身并不具备完整的控件特性,而是作为一个内容呈现的占位符,负责将某个内容对象的实际视觉表示呈现出来。
  2. 内容代理

    • ContentPresenter 不直接存储内容,而是通过其 Content 属性接收从父控件传递过来的内容对象。它的主要职责是查找并应用与该内容对象相关的数据模板(如 DataTemplate 或 ContentTemplate),将内容对象转换成可视化的 UI 元素。
  3. 模板化机制

    • ContentPresenter 是 WPF 模板化系统的核心组件之一。当它嵌入在一个控件模板中时,会根据上下文自动选择合适的模板来呈现内容。如果提供了 ContentTemplate 或 DataTemplateContentPresenter 会使用这些模板;如果没有显式指定模板,它会尝试根据内容对象的类型查找已注册的数据模板。
  4. 间接使用

    • 开发者通常不会直接在 XAML 中声明一个单独的 ContentPresenter,除非是在编写自定义控件模板时。大多数情况下,ContentPresenter 作为控件模板的一部分,隐藏在诸如 ContentControlHeaderedContentControl(如 GroupBoxExpander)以及 ItemsControl(如 ListBoxTabControl)等更高级别的控件内部。

总结来说,ContentControl 是一个功能完备的控件,用于承载和显示单一内容对象,提供了丰富的可定制性。而 ContentPresenter 是一个内部组件,专注于将内容对象与相应的数据模板匹配并呈现出来,它是实现 WPF 模板化机制的关键部件,通常不直接暴露给开发者使用,而是隐含在其他控件的模板结构中。两者协同工作,共同实现了 WPF 中灵活且强大的内容呈现体系。

标签:控件,ContentControl,C#,ContentPresenter,内容,WPF,模板
From: https://www.cnblogs.com/z5337/p/18154475

相关文章

  • Cisco Catalyst 9800 Wireless Controller, IOS XE Software Release IOSXE-17.14.01
    CiscoCatalyst9800WirelessController,IOSXESoftwareReleaseIOSXE-17.14.01EDCatalyst9800系列无线控制器软件请访问原文链接:CiscoCatalyst9800WirelessController,IOSXESoftwareReleaseIOSXE-17.14.01ED,查看最新版。原创作品,转载请保留出处。作者主页:sy......
  • Cisco Catalyst 9800-CL Wireless Controller for Cloud, Release IOSXE-17.14.01 ED
    CiscoCatalyst9800-CLWirelessControllerforCloud,ReleaseIOSXE-17.14.01ED面向云的思科Catalyst9800-CL无线控制器,专为基于意图的网络全新打造请访问原文链接:CiscoCatalyst9800-CLWirelessControllerforCloud,ReleaseIOSXE-17.14.01ED,查看最新版。原创作......
  • Python基于opencv实现的人脸识别--入门项目
    先去opencv官网下载人脸识别的训练集https://opencv.org/releases/解压目录要记录主要使用haarcascade_frontalface_default.xml摄像头录入人脸(可选)可以弄一个文件夹,里面放一堆图片importcv2face_name='xxxx'#该人脸的名字#加载OpenCV人脸检测分类器face_cas......
  • python包:CV
    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语......
  • 实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台
      一、产品概述   基于CPCI结构完成40路AD输入,30路DA输出的信号处理平台,处理平台采用双DSP+FPGA的结构,DSP采用TI公司新一代DSPTMS320C6678,FPGA采用XilinxV55VLX110T-1FF1136芯片,设计尽量采用工业级芯片。该方案描述了技术要求,硬件设计、软件设计方案......
  • van-dialog 点击confirm确定时如果不满足条件则不允许关闭
    <van-dialogv-model="showDialog"@confirm="confirmFn"@cancel="showDialog=false"title="添加故障现象"show-cancel-button:before-close="onBeforeClose">......
  • 计算今天是该年的第几天(c语言实现)
    遇到一个有意思的编程题,使用C语言实现计算今天是该年的第几天。实现代码如下:#include<stdio.h>intd[12]={31,28,31,30,31,30,31,31,30,31,30,31};//将每月天数存在数组中(类似字典)intadd(intmonths,intflag,intdays)//计算天数{intnum=0,i=0;if(flag>0)//......
  • 电力控制系统设计方案:923-6U CPCI的光纤网络电力控制系统
    6UCPCI的光纤网络电力控制系统 一、设备概述   柔性直流输电系统中用于控制与测量的FS系统,适用于风电和太阳能发电的并网快速数值计算和闭环控制,以及与直流输电系统的换流器有关的特殊控制功能,包括门控单元的信号处理。该控制板的最大响应周期为1us,可以适......
  • oracle select语句造成锁行的问题
    1、select*from表where codein(1,2,3);2、update表setcode = 4wherecode=1;以上两步是平时可能用到的写法,先查询在修改(理解我意思就行)。如果在高并发的情况下,这种情况更容易发生。select语句使用非聚族索引查询,会对非聚族索引添加共享锁,由于非聚族索引上没有se......
  • 将C++代码文件路径、行号、函数名称等打包到#pragma message输出的方法
    #include<iostream>#define__GEN_STRING_IMPL(x)#x#define__GEN_STRING(x)__GEN_STRING_IMPL(x)#define__GEN_LOCATION_STRING()__FILE__"("__GEN_STRING(__LINE__)"):"classCTestObject{public:voidprint1(){......