WPF——ContentPresenter

文章目录

  • 一、前言
  • 二、认识
    • 2.1. 涉及名词释义
    • 2.2. 定义
    • 2.3. 例子
    • 2.4. 注解*
  • 三、参考

一、前言

     ~~~~     这个类单独拿出来讲,是因为它既很重要又很迷惑。说重要是因为一般DataTemplate的载体(作用对象)就是它,而且你用MSBlend敲开一个控件你会发现每每都存在它。说迷惑是因为,你在相关类的属性中发现不了它。


二、认识

2.1. 涉及名词释义

     ~~~~     部分涉及英语单词后面用中文释义了。

名称 释义 类型
ContentControl 内容控件 class
DataTemplate 内容模板 class
ControlTemplate 控件模板 class
ContentPresenter 内容呈现器 class
Template 控件模板 ControlTemplate类型的属性
ContentTemplate 内容模板 DataTemplate类型的属性
Notes:
所以后面说Template就是指ControlTemplate类型的属性,
ContentTemplate就是DataTemplate类型的属性,
两者区别就是说Template时指的是属性,说ControlTemplate指的是这个类,
ContentTemplate与DataTemplate同理,不过有时候可以等同起来。

2.2. 定义

     ~~~~     也不花里胡哨,直接看看官方文档里它的定义。
WPF——ContentPresenter_第1张图片
     ~~~~     作用言简意赅,用于呈现ContentControl的Content内容

     ~~~~     看看继承关系类图,特别注意它的属性,它只有ContentTemplate(内容模板)属性,没有Template(控件模板)属性,这就证明了它的用途必定与DataTemplate有关。
WPF——ContentPresenter_第2张图片

2.3. 例子

     ~~~~     下面展示了一个Button Style用于设置Button的ControlTemplate。这个ControlTemplate
定义了一个在Grid元素内部的椭圆形按钮。ContentPresenter标明了按钮应该呈现的内容并且使之处于Grid的中心。
     ~~~~     这是它的主要XAML,

	<Application.Resources>
       <Style TargetType="Button">
           "OverridesDefaultStyle" Value="True"/>
           "Template">
               
                   "Button">
                       
                           "{TemplateBinding Background}"/>
                           "Center" VerticalAlignment="Center"/>
                       
                   
               
           
       Style>
   Application.Resources>

     ~~~~     主窗体中添加一个按钮,

	<Grid>
        <Button Content="Content" Background="LightBlue"/>
    Grid>

     ~~~~     效果如下图,你的按钮变成了下面的外形。
WPF——ContentPresenter_第3张图片
     ~~~~     此时,你若把ContentPresenter注释掉,


     ~~~~     运行效果如下,
WPF——ContentPresenter_第4张图片
     ~~~~     内容就得不到呈现了,至此,ContentPresenter这个名字也非常好理解了,就是内容呈现者——用于呈现内容的。

2.4. 注解*

     ~~~~     通常,会使用ContentPresenter在一个ContentControl的ContentTemplate属性中来指定内容添加的位置。 每个ContentControl类型的默认控件模板中都会有一个ContentPresenter(来呈现ContentControl的内容)。
     ~~~~     当一个ContentPresenter对象位于ContentControl的ControlTemplate中时,该对象的Content,ContentTemplate以及ContentTemplateSelector属性会从ContentControl中的相同名称的属性中取得值(就如2.3例子的情况)。(从下面继承关系的类图可知,ContentControl和ContentPresenter中都有一个ContentTemplate属性,意思就是ContentPresenter的ContentTemplate会使用ContentControl的ContentTemplate数据)
WPF——ContentPresenter_第5张图片
你可以通过设置ContentSource属性或者绑定的方式来让ContentPresenter属性从其他的模板化父亲(Templated Parent)的属性中获取值。
     ~~~~     ContentPresenter使用以下的逻辑来显示Content内容(流水账,看懂两个就好):

  • 如果已经设置了ContentPresenter中的ContentTemplate属性,ContentPresenter会将这个DataTemplate(指的就是ContentTemplate)应用到Content属性上并且显示作为结果的UIElement和它的子元素(将DataTemplate内的控件树显示)。
  • 若设置了ContentTemplateSelector,ContentPresenter就会将合适的DataTemplate应用到Content上并显示作为结果的UIElement和它的子元素。
  • 若有DataTemplate关联到Content,ContentPresenter会将DataTemplate应用到Content上并且显示UIElement和子元素。。
  • 若Content是UIElement对象,UIElement就会被呈现。若UIElement已经有一个父亲,会产生一个异常。
  • 若有一个用于将Content转化为UIElement的TypeConverter,ContentPresenter就会用这个TypeConverter并呈现UIElement。
  • 若有一个用于将Content转化为string的TypeConverter,ContentPresenter就会用这个TypeConverter并创建一个TextBlock来容纳那段string,接着TextBlock会被显示。
  • 若内容是XmlElement,InnerText属性的值会显示在TextBlock中
  • ContentPresenter在Content上调用ToString方法并创建一个TextBlock来容纳这个ToString返回的string。接着TextBlock被显示。

三、参考

微软官方文档

你可能感兴趣的:(WPF,wpf)