首页 技术 正文
技术 2022年11月20日
0 收藏 935 点赞 2,434 浏览 2039 个字

因为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}”/>

  结果:

  

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

  如果用Content来绑定Header属性:

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

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

下一篇: Test Index
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,105
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,582
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,429
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,836
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,919