ContentPresenter.ContentSource与Content的区别

17

基本上,我不明白这里的真正区别是什么:

Microsoft TabItem 的代码使用:

<ContentPresenter ContentSource="Header" ... />

那么,什么情况下会使用Content属性而不是(或者除了)ContentSource

1个回答

25

当ContentPresenter位于模板中时,应仅使用此属性。模板包含具有ContentSource设置为"Abc"的ContentPresenter时,Content、ContentTemplate和ContentTemplateSelector属性将自动别名为Abc、AbcTemplate和AbcTemplateSelector。从.NET Framework 3.5 Service Pack 1开始,将ContentSource设置为"Abc"还会导致ContentStringFormat属性被别名为AbcStringFormat。

对于此属性最常用的两个值是"Content"和"Header"。

(MSDN)

ContentSource显然为了方便而一次性设置更多的属性。


实际上,以下声明:

<ContentPresenter ContentSource="Header" />

执行以下初始化操作。

<ContentPresenter Content="{TemplateBinding Header}"
                  ContentTemplate="{TemplateBinding HeaderTemplate}"
                  ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
                  ContentStringFormat="{TemplateBinding HeaderStringFormat}" />

仅当模板化控件上存在依赖属性时,它才会单独为每个属性执行此操作。


这解释了很多(文档没有的!)我一直想知道为什么在模板中只有一个ContentPresenter而没有设置Content仍然可以工作。现在我知道它是因为它确实从此属性隐式设置Content(以及其他属性)。他们真的应该更新文档,因为“别名”实际上相当于使用TemplateBinding。如果他们说明了这一点,甚至提到了TemplateBinding,那就会更清楚了。您的代码示例完美地做到了这一点。太棒了! - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接