因为ContentPresenter.ContentSource比Content属性加一个TemplateBinding看起来更方便?不仅仅是这些,实际上如果用ContentSource的话,Content相关的属性比如ContentStringFormat,ContentTemplate和ContentTemplateSelector都会被自动设置,而如果用Content加TemplateBinding,你必须手动将上述属性绑定到ContentPresenter上。

  比如使用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属性?的更多相关文章

  1. WPF的Presenter(ContentPresenter)(转)

    这是2年前写了一篇文章 http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html 我们先来看M ...

  2. WPF的Presenter(ContentPresenter)

    WPF的Presenter(ContentPresenter) 2010-12-20 14:34 by Clingingboy, 10619 阅读, 3 评论, 收藏, 编辑 这是2年前写了一篇文章 ...

  3. [转]WPF的Presenter(ContentPresenter)

    这是2年前写了一篇文章 http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html 我们先来看M ...

  4. WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果

    原文:WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果   本以为Label也有TextChanged 事件,但在使 ...

  5. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  6. 《Programming WPF》翻译 第5章 3.命名属性

    原文:<Programming WPF>翻译 第5章 3.命名属性 通过把同样的内嵌样式提升到资源中(正如第一章介绍的),我们可以给它一个名字,以及按名字使用它在我们的Button实例上, ...

  7. CSS3中的counter和content属性,一些简单的内容显示就不需要JS去实现了

    HTML的代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www ...

  8. css3 的content 属性

    content属性想必大家都熟悉了,一般结合伪类一起使用,表示显示的内容 例如:.box:before{content:"hello";width:100px;line-heigh ...

  9. Easyui tabs的herf和content属性

    在backstage.jsp页面中我写了一个方法,用于在指定位置添加面板(id为msg的地方)function addTab(t,h){ if($('#msg').tabs('exists',t)){ ...

随机推荐

  1. HDU 1512 Monkey King(左偏树)

    Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each does thi ...

  2. 【备忘】mysql常用操作汇总

    1.增删改查 // 插入一条数据 insert into tableName values('liu','bei') // 删除一条数据 delete from tableName where las ...

  3. df -h 卡住

    mount 检查是否有挂载nfs的分区       网络挂载     如果有请umount  -l   /相应目录      umount -l  10.74.82.205:/letv/fet/nfs ...

  4. wpa_supplicant与kernel交互

    wpa_supplicant与kernel交互的操作,一般需要先明确驱动接口,以及用户态和kernel态的接口函数,以此来进行调用操作.这里分为4个步骤讨论. 1.首先需要明确指定的驱动接口.因为有较 ...

  5. HashCode和equals的理解

    -------------------------------------------------------------------------------------------第一篇博客---- ...

  6. linux线程同步实例

    [Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details ...

  7. linux上使用J-Link调试S3C2440裸机代码

    linux上使用J-Link调试S3C2440裸机代码 工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb ...

  8. YaoLingJump开发者日志(一)

      写完PokeCats之后意犹未尽,还想做一个更加有趣的游戏,比如说像超级玛丽那样.   游戏的主角就选"瑶玲"了,这是我小时候最喜欢的动画片<瑶玲啊瑶玲>的女主角. ...

  9. LoadRunner中执行命令行

    在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样,但是system()有个缺陷:无法获取命令的返回结果. 也许可以用`echo command > fi ...

  10. mac mysql连接报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    找了半天 又是kill进程,又是改设置文件,又是重启电脑,都不管用 翻到stackoverflow上的解决方案,实施成功: 原文链接:https://stackoverflow.com/questio ...