zoukankan      html  css  js  c++  java
  • WPF Knowledge Points ContentControl和ContentPresenter的区别

    从类的层次级别,结合例子,说明ContentControl和ContentPresenter的作用和关系。同时,也对比了ItemsControl和ItemsPresenter,更有利于从WPF整体的类结构来对比理解。

    我们先看类层次
    ContentControl继承自Control,而ContentPresenter继承自FrameworkElement。所以最根本的认识:ContentControl是一个控件,而ContentPresenter直接来自FrameworkElement(Control直接继承自FrameworkElement)。同理,ItemsControl继承自Control,而ItemsPresenter继承自FrameworkElement。

    ItemsControl是一个控件,它知道如何显示数据集合(Collection of data),再其内部包含有ItemsPresenter。比较常见的来自ItemsControl的控件,比如ComboBox,ContextMenu,ListBox,DataGrid,ListView等。
    ContentControl是一个控件,它知道如何显示单个数据(non-collection data),在其内部包含有ContentPresenter。比较常见的来自ContentControl的控件,比如Button,Label等。

    结合例子深入细节
    ContentPresenter元素被用于ContentControl的template的内部,我们可以把ContentPresenter放置在我们需要的特定的地方。比如,一个Button的Content为“MyButton”,我们为这个Button重写一个ControlTemplate,如果我们不放置ContentPresenter,“MyButton”这个词就不会被显示;如果我们在ControlTemplate的某个位置放置的ContentPresenter,“MyButton”就会显示的相应的位置。

    所以一个ContentPresenter可以看成是下面逻辑的等效:

    <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" />

    ContentPresenter隐式假设以上这些就是大多数人默认需要的内容(事实也确实如此),所以以下更为简洁的等效写法:

    <ContentPresenter/>

    但是,当我们不想用ContentPresenter默认的行为的时候,我们可以自己定义,比如:

    <ContentPresenter Content="{TemplateBinding Height}"/>

    这个时候,ContentPresenter的位置,就会显示高度,如“320”,而不是“MyButton”。

    结论
    总的来说,ContentControl是一个拥有ControlTemplate的控件,用来显示单个非集合数据;ContentPreseter用来指定content在ContentControl(ControlTemplate)中的位置。

  • 相关阅读:
    士兵队列训练问题http://acm.hdu.edu.cn/showproblem.php?pid=1276
    Fence Repair http://poj.org/problem?id=3253
    A/B http://acm.hdu.edu.cn/showproblem.php?pid=1576
    房间安排http://acm.nyist.net/JudgeOnline/problem.php?pid=168
    Function Run Fun http://poj.org/problem?id=1579
    盗梦空间http://acm.nyist.net/JudgeOnline/problem.php?pid=125
    如何在Chrome中使用”并非来自Chrome网上应用店”的扩展程序
    C++中的函数指针模板
    C/C++中的源文件与头文件的区别
    C++同名函数的各种问题
  • 原文地址:https://www.cnblogs.com/KeithWang/p/2444133.html
Copyright © 2011-2022 走看看