我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement);

同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement.

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

ContentPresenter就是負責將Content屬性顯示出來.

接著來我們看一下實例,

實例1:不使用ContentPresenter

使用ContentPresenter

            <ContentControl Content="YangMark">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<ContentPresenter></ContentPresenter>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
輸出結果: YangMark
正確顯示Content!!
 
不使用ContentPresenter
            <ContentControl Content="YangMark">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl"> </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"></ContentPresenter>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
輸出結果:Hello!! YangMark
 
            <ContentControl Content="YangMark" ContentStringFormat="Hello!! {0}">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<ContentPresenter Content="{TemplateBinding Content}"></ContentPresenter>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
輸出結果:YangMark
僅出現Content屬性的內容!!
 
結論2:<ContentPresenter/>與<ContentPresenter ContentSource="Content"/> 意義上是相同的。
它們同時綁定了Content, ContentStringFormat, ContentTemplate和ContentTemplateSelector等內容

屬性。

若僅用Content="{TemplateBinding Content}"代表只綁定Content屬性而已,且ContentSource會失效。
 
 

實例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聲明指定的對象.

參考資料:

 
 

WPF 正確理解ContentPresenter的更多相关文章

  1. 正确理解ContentPresenter

    下图显示继承关系: ContentControl:Control (在Control類並沒有Content屬性, 所以在這之上再寫了一個ContentControl, 使控件有Content屬性可以顯 ...

  2. 如何正確的使用 Runtime.exec()

    或許大部分有寫過Java程式的人都知道java.lang.Runtime這個class有一個method叫做exec(),可以被用來呼叫(調用)外部的程式.然而大部分的人都不知道這個method存在著 ...

  3. WPF MVVM 之理解(数据绑定)

    (申明:最近在做一个练习,写点东西,谨供参考.) 1.界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(Entity Framework)实体框架,不做介绍). ...

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

    因为ContentPresenter.ContentSource比Content属性加一个TemplateBinding看起来更方便?不仅仅是这些,实际上如果用ContentSource的话,Cont ...

  5. WPF属性之理解附加属性

    附加属性,顾名思义,和被附加的控件没有依赖关系,只是强行给目标控件挂上一个“属性值”,以便于操作之.就好比,你在学校是学生,那么就要听老师的管教,在公司是下属,就要服从老板的命令一样. 我们常见的附加 ...

  6. win7下登入本機、域的正確方法

    win7的登入与以前的windows系统有所不同,如果win7的电脑已经被加入到域後,登入有两种类别: 1: 要登入到域,直接输入域用户账号和密码. 2:要登入到本机,则要输入计算机名\本机用户账号和 ...

  7. WPF : ControlTemplate和DataTemplate的区别

    ControlTemplate用于描述控件本身. 使用TemplateBinding来绑定控件自身的属性, 比如{TemplateBinding Background}DataTemplate用于描述 ...

  8. 从Excel转Access的一个方法说开去(DataRow的state状态)

    因为客户对access不太熟悉,更喜欢玩EXCEL.但是系统要求导入ACCESS.所以我们得做个把EXCEL转换成Access的小工具.(别问我为啥不让系统直接导入excel....我不知道!),然后 ...

  9. 在WPF中制作正圆形公章

    原文:在WPF中制作正圆形公章 之前,我利用C#与GDI+程序制作过正圆形公章(利用C#制作公章 ,C#制作公章[续])并将它集成到一个小软件中(个性印章及公章的画法及实现),今天我们来探讨一下WPF ...

随机推荐

  1. 为PyCharm自动配置作者信息

    在团队开发中,需要在代码中编写一些项目信息或个人信息,如开发者.开发时间.项目名称等信息,以利于后期对项目修改和维护.如果每次都需要手动编写,费时费力.下面介绍如何自动在代码文件中自动生成这些信息. ...

  2. seleniumIDE是Firefox的录制功能使用

    selenium第二课(脚本录制seleniumIDE的使用) 转自:https://www.cnblogs.com/hustar0102/p/5906958.html 一.Selenium也具有录制 ...

  3. vue 路由里面的 hash 和 history

    对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义.前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求. ...

  4. ReentrantReadWriteLock原理

    原文链接:https://www.jianshu.com/p/9f98299a17a5 前言 本篇适用于了解ReentrantLock或ReentrantReadWriteLock的使用,但想要进一步 ...

  5. 一些优秀的Firefox扩展

    AdBlock Plus 拦截广告. 在对付CSDN等垃圾网站时非常有用. Block Site 拦截你不想看的网站 没有知乎的一天真好... XStyle 设置自己喜欢的CSS样式(表示自己并不会用 ...

  6. CF1076C Meme Problem 数学

    Try guessing the statement from this picture: You are given a non-negative integer d . You have to f ...

  7. 在线作图工具 Flowchart Maker & Online Diagram Software & Visual Solution

    9款国内外垂直领域的在线作图工具:那些可以替代Visio的应用!-CSDN.NEThttps://www.csdn.net/article/2015-02-12/2823939 Documentsht ...

  8. Appium教程——Desired Capabilities 详解(转自TesterHome)

    Desired Capabilities在启动session的时候是必须提供的. Desired Capabilities本质上是key value的对象,它告诉appium server这样一些事情 ...

  9. sharepoint_study_7

    描述:sharepoint网站上部署WebPart出错后,如何删除错误的WebPart?如何恢复原页面? 解决:到管理中心去将该解决方案收回并删除,可以恢复原页面,但是错误的webpart信息会保留, ...

  10. 求范围内【l,r] , 内二进制的零比一多的数

    #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> # ...