下图显示继承关系:

ContentControl:Control (在Control類並沒有Content屬性, 所以在這之上再寫了一個ContentControl, 使控件有Content屬性可以顯示內容)

ContentPresenter:FrameworkElement (ContentPresenter一般用在CT里负责把Control指定的Content显示出来)

Control:FrameworkElement

ItemsControl:Control

ItemsPresenter:FrameworkElement

接著來我們看一下實例:

使用ContentPresenter

            <ContentControl Content="YangMark"><ContentControl.Template><ControlTemplate TargetType="ContentControl"><ContentPresenter/></ControlTemplate></ContentControl.Template></ContentControl>
輸出結果: YangMark
正確顯示Content!!
 
不使用ContentPresenter
            <ContentControl Content="YangMark"><ContentControl.Template><ControlTemplate TargetType="ContentControl"><ContentPresenter/></ControlTemplate></ContentControl.Template></ContentControl>

輸出結果:      
無法顯示出Content!!

結論1:ContentPresenter通常出現在ControlTemplate內,且若不使用ContentPresenter則Content屬性就無法正常顯示。

 
實例2:ContentPresenter中的ContentSource屬性
為什麼只為了顯示出Content屬性要大費周張弄出ContentPresenter呢??
我們可以先比較以下兩種代碼不同之類,
            <ContentControl Content="YangMark" ContentStringFormat="Hello!! {0}"><ContentControl.Template><ControlTemplate TargetType="ContentControl"><ContentPresenter ContentSource="Content"/></ControlTemplate></ContentControl.Template></ContentControl>


輸出結果:Hello!! YangMark
            <ContentControl Content="YangMark" ContentStringFormat="Hello!! {0}"><ContentControl.Template><ControlTemplate TargetType="ContentControl"><ContentPresenter Content="{TemplateBinding Content}"/></ControlTemplate></ContentControl.Template></ContentControl>

輸出結果:YangMark
僅出現Content屬性的內容!!
 
結論2:<ContentPresenter/>與<ContentPresenter ContentSource="Content"/> 意義上是相同的。

写ContentSource它們同時綁定了Content, ContentStringFormat, ContentTemplate和ContentTemplateSelector等內容

若僅用Content="{TemplateBinding Content}"代表只綁定Content屬性而已,还要手动绑定其他ContentStringFormat, ContentTemplate和ContentTemplateSelector等。

實例3:ContentSource的應用

 以HeaderContentControl為例,使用ContentPresenter綁定內容屬性。
            <HeaderedContentControl Header="Header" HeaderStringFormat="I'm {0}"Content="Content" ContentStringFormat="I'm {0}"><HeaderedContentControl.Template><ControlTemplate TargetType="HeaderedContentControl"><DockPanel><ContentPresenter ContentSource="Header" DockPanel.Dock="Top"></ContentPresenter><!--等同於<ContentPresenter ContentSource="Content"/>--><ContentPresenter></ContentPresenter></DockPanel></ControlTemplate></HeaderedContentControl.Template></HeaderedContentControl>

輸出結果:

I'm Header

I’m Content

結論3:ContentSource若指定對象為Content是可以省略的,若不為Content(如:Header)則不能省略。

總結:

Content, ContentStringFormat, ContentTemplate和ContentTemplateSelector等屬性, 我將它們稱為內容屬性.

1. ContentPresenter的作用就是用來顯示內容屬性

2.ContentSource若指定對象為Content,則等同於<ContentPresenter/>; 若指定對象不為Content,

則必須使用ContentSource聲明指定的對象.

參考資料:

比如使用ContentPresenter的ContentSource,然后在ContentControl中设置ContentStringFormat:

<Window.Resources>

<Style TargetType="ContentControl">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="ContentControl">

<!-- 这里等价于直接<ContentPresenter /> -->

<!-- 强调一下直接用ContentPresenter其ContentSource属性为Content -->

<ContentPresenter ContentSource="Content"/>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</Window.Resources>

<ContentControl ContentStringFormat="你好:{0}">Mgen</ContentControl>

结果会输出:你好:Mgen。

如果把上面ContentPresenter改用TemplateBinding绑定ContentControl的Content属性:

<ContentPresenter Content="{TemplateBinding Content}"/>

结果只会输出:Mgen。

此时其实ContentStringFormat,ContentTemplate和ContentTemplateSelector都不会管用的,那么只能再用TemplateBinding都把他们在ContentPresenter中绑定好:

<ContentPresenter Content="{TemplateBinding Content}"

ContentStringFormat="{TemplateBinding ContentStringFormat}"

ContentTemplate="{TemplateBinding ContentTemplate}"

ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"/>

当然ContentPresenter不仅限于ContentControl,可以用在任何类似ContentControl.Content这样的控件属性中,比如HeaderedContentControl.Header属性。

这样定义HeaderedContentControl的控件模板:

<Style TargetType="HeaderedContentControl">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="HeaderedContentControl">

<DockPanel>

<Border DockPanel.Dock="Top">

<ContentPresenter ContentSource="Header"/>

</Border>

<!-- 等于:<ContentPresenter ContentSource="Content"/> -->

<ContentPresenter/>

</DockPanel>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

示例:

<HeaderedContentControl Header="Header"

Content="Content"

HeaderStringFormat="上:{0}"

ContentStringFormat="下:{0}"/>

结果:

如果用Content来绑定Header属性:

<ContentPresenter Content="{TemplateBinding Header}"/>

那么你还得再次绑定ContentStringFormat,ContentTemplate和ContentTemplateSelector属性,所以记住总是用ContentPresenter.ContentSource属性。

WPF:为什么使用ContentPresenter.ContentSource而不是Content属性?

wpf控件开发基础(1)

转WPF的Presenter(ContentPresenter)

转载于:https://www.cnblogs.com/shawnzxx/p/3346975.html

正确理解ContentPresenter相关推荐

  1. 正确理解WPF中的TemplatedParent

    原文:正确理解WPF中的TemplatedParent http://www.cnblogs.com/mgen/archive/2011/08/31/2160581.html (注:Logical T ...

  2. ADSL的PPPOE拨号客户端上的ppp authentication pap “callin”的正确理解

    ADSL的PPPOE拨号客户端上的ppp authentication pap "callin"的正确理解 对callin参数的理解一定要注意,很容易单让初学者通过"中国 ...

  3. 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。

    调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优.  个人理解

  4. html的区域大小,JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性...

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...

  5. 智能的定义是什么?如何正确理解智能家居?

    近几年,智能家居是一个比较火爆的行业!有很多的人(特别是寻找好的创业的项目的朋友)想从事这个行业,也有很多是想在自己家里装上智能化,享受科技带来的生活便利:还有部分人处于对智能家居的了解期.不管你属于 ...

  6. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  7. 软件测试作业1:正确理解原型方法对软件生命周期不同阶段的支持

    作业1 1.正确理解原型方法对软件生命周期不同阶段的支持,分别给出:辅助或代替分析阶段:辅助设计阶段:代替分析与设计阶段:代替分析.设计和实现阶段:代替全部开发阶段所对应的开发活动执行时间顺序. 答: ...

  8. python函数可以作为容器对象吗_正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  9. c语言正确理解以下名词及其含义,C程序作业答案.doc

    C程序作业答案.doc 什么是程序及程序设计 程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行 操作的一系列语句和指令.一般分为系统程序和应 ...

最新文章

  1. 2010.4.18 OA 项目组一周工作报告
  2. 计算机视觉与图像处理相关的国内外重要期刊汇总
  3. python3 使用 socket.gethostbyname 报错 getaddrinfo failed 解决方法
  4. 《Access 2007开发指南(修订版)》一一1.3 具有缩放能力的Access
  5. IIS配置网站定时任务必设参数图文教程
  6. AI也脸盲 |黑人遭人脸识别技术“误判”概率竟高出白人5至10倍!
  7. JAVA自学笔记22
  8. Python 进阶之路 (八) 最用心的推导式详解 (附简单实战及源码)
  9. CodeForces - 1288C Two Arrays(组合数学)
  10. nginx与apache详细性能对比
  11. 我就是古董店的那个店小二……专司收藏……
  12. HDU 6071 Lazy Running
  13. 获得OnOK退出控制
  14. .NET 3.5(14) - XLINQ(LINQ to XML)之针对XML文件的添加、查询、更新和删除
  15. AWT_Swing_初始化(Java)
  16. Weka开发[8]-ID3源码介绍
  17. Unity3d 免费么?
  18. 冰点还原精灵如何暂时关闭运行
  19. 洪水!(Flooded!)
  20. 即墨德馨小学鸿蒙,【最美校园竞晒】青岛市即墨区德馨小学

热门文章

  1. Spark的三种伪分布式方式
  2. gedit把关键字符替换为回车键
  3. 红黑树 删除某节点后 旋转3次 举例
  4. Qt中消息的机制原理
  5. java 开源 网络流量统计_jpcap java流量监控
  6. java 304_分析HTTP请求返回304状态码
  7. CF986A Fair
  8. 19号以后包括数组在内的所有内容(数组、函数、方法、dom操作)
  9. JPA关系映射系列一:one-to-one外键关联
  10. springmvc 后台向页面EasyUI的Datagrid传递数据(JSon格式)