1.DispatcherObject类表示具有相关联的对象分派器。调度程序处理要在特定线程上执行工作的请求队列。它能够在其关联的线程上调用方法。

DispatcherObject是对象的基类,用于跟踪与创建它们的线程关联的Dispatcher

WPF控件继承自DispatcherObject,因为它们需要从创建它们的线程调用它们的方法。

DispatcherObject有两个方法可以帮助确保从正确的线程调用控件的方法。

  • CheckAccess - 检查当前线程是否可以调用控件上的方法
  • VerifyAccess - 如果没有访问权限,则抛出InvalidOperationException

如果控件确定当前线程没有访问权限,则可以使用其Dispatcher属性(也在DispatcherObject中)在正确的线程上调用方法。

2.DependencyObject是支持依赖项属性的类的基类。

WPF中的依赖项属性类似于标准CLR属性,但功能更强大。依赖属性:

  • 从许多不同来源中的一个获取它们的值
  • 支持属性值的继承
  • 属性值更改时的支持通知

如果一个类派生自DependencyObject,那么该类可以注册自己的依赖项属性并调用方法来获取/设置其依赖项属性的值。

3.Visual是表示可以呈现给WPF窗口或页面的对象的所有类的基类。它为命中测试,剪切和坐标转换提供支持,并为窗口或页面呈现自身。它还通过VisualParent属性和GetVisualChild方法模拟对象在WPF可视化树中的参与。

视觉类也可用于实现新的(轻量)WPF控制的起始点。

4.UIElement类继承自视觉和增加了基本的用户交互行为,包括支持:

  • 布局行为

    • 父/子关系
    • 测量/排列通行证
  • 响应用户输入
    • 从键盘/鼠标等设备输入事件
    • 命令绑定
  • 管理焦点
  • 触发(并响应)路由事件
    • 事件冒泡(向上)或隧道(向下)元素树

注意形成的首字母缩略词,这有助于思考UIElement  - FrameworkElement与FrameworkContentElement

FrameworkElement(FE)派生自UIElement。FrameworkContentElement(FCE)派生自ContentElement。由于框架不是基于支持多重继承的语言(感谢上帝!),因此分歧是必要的。每个FE都有一些你不想要的ContentElement部分,并且每个FCE都有你不想要的UIElement部分。

FCE基本上存在以支持文本格式化引擎(可以在MS.Internal.Text命名空间中找到)。有一些非文本类派生自FCE,但他们这样做只是为了轻量级。

目标是使处理FE和FCE的编程体验尽可能相似。如果还有的话,我认为这使得框架更加优雅。

您可以将FCE视为具有FE的所有内容,除了支持布局/渲染。当然,这不是一个小功能,你肯定不希望每个文本元素都有这种开销。如果您尝试使用WPF的布局引擎渲染每个文本笔划,请想象一下,如果您试图使用WPF的布局引擎来渲染每一个文本的笔画,那么文本就太复杂了。

没错,看到在两个完全不同的基类上定义的完全相同的属性,方法,接口,事件等是很奇怪的。但我想一般反应仅仅是耸耸肩。只要微软愿意维护代码,我就没有问题。(事实上​​,在构建过程中,类之间共享的大部分代码都是代码生成的,所以它们对于维护它们并不困难......聪明的人!)

旁注:IFE与LIFE:我们过去使用的助记符是“LIEE从UIElement开始”。也就是说,每个UIElement都支持布局,输入,焦点和事件 Layout, Input, Focus, and Events。ContentElement为您提供除“L”之外的所有内容。因此,FE和FCE之间的功能交叉是IFE部分。

如果您想以多态方式处理框架对象的IFE部分,我建议创建一个帮助器类。实现起来很容易......实际上,您可以从内部FrameworkObject类中窃取大部分实现。

5.FrameworkElement的类继承自的UIElement并且又在WPF的所有控件的父类。

FrameworkElement构建于UIElement之上,并添加了以下功能:

  • 布局 - 通过实现Horizo​​ntalAlignment,MinWidthMargin等属性来实现布局模型
  • 通过BeginStoryboard方法支持动画
  • 数据绑定
  • 用于绑定的数据模板
  • 样式

FrameworkElement也是将添加到逻辑树(包含用户界面的可视对象的层次结构)的对象的主基类。

6.Control class控制类继承自FrameworkElement并且是用于所有用户交互控件的基类。控件的示例包括:TextBoxLabelListBoxComboBoxButtonPanelGrid等容器元素不是控件。

控制类扩展FrameworkElement的功能:

  • 通过使用模板更改控件的可视外观
  • 支持字体,边框和背景颜色等可视元素

7.内容控件ContentControl,可以包含一个表示其内容的嵌套元素。由于嵌套元素可以是任何内容,因此从ContentControl派生的控件可以存储各种不同类型的内容。

内容控件具有Content属性,该属性指向它们包含的单个元素。该元素通常是UIElement,但可以是任何.NET对象。

这是一个示例,CheckBox使用DatePicker作为其内容。

<CheckBox Height="31" HorizontalAlignment="Center" Name="checkBox1" VerticalAlignment="Center">
<DatePicker Name="datePicker1" />
</CheckBox>

请注意,因为Window类是内容控件,所以Window只可能有一个子元素。

您可以在内容控件中有效地包含一组控件,方法是将单个容器对象作为其内容包含在内,该容器对象又包含其他元素。(例如,一个Button可以包含一个StackPanel,然后包含其他元素)。

8.ItemsControl是另一个从Control继承的WPF类,用作其他控件的基类。从ItemsControl继承的控件显示项集合。

ItemsControl派生的控件通常使用数据绑定获取要显示的项列表,绑定到实现IEnumerable的对象

直接或间接从ItemsControl继承的控件包括:MenuContextMenuComboBoxListBoxListViewTabControlDataGridStatusBarToolBarTreeView

[No0000171]wpf 类层次结构Class Hierarchy的更多相关文章

  1. WPF类层次结构

    WPF类层次结构 System.Threading.DispatcherObject类 WPF应用程序使用STA(Single Thread Affinity)模型,整个用户界面由一个单独的线程拥有, ...

  2. 在JavaScript里写类层次结构?别那么做!

    从理论上讲,JavaScript并没有类.在实践中,下面的代码片段被广泛认为是JavaScript“类”的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fu ...

  3. iBATIS 框架主要的类层次结构

    iBATIS 框架主要的类层次结构 总体来说 iBATIS 的系统结构还是比较简单的,它主要完成两件事情: 根据 JDBC 规范建立与数据库的连接: 通过反射打通 Java 对象与数据库参数交互之间相 ...

  4. [翻译] FastReport Class Hierarchy (FastReport 组件类层次结构)

    "TfrxComponent" is the base class for all FastReport components. Objects of this type have ...

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 面试准备(三) Java 异常类层次结构

    在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的 ...

  7. Java 异常类层次结构

    在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中. 下面的图展示了Java异常类的继承关系. 图1 粉红色的是受检查的异常(checked exceptions),其必须被 ...

  8. idea中查看类层级class hierarchy

    idea中,我当前设置的是eclipse的快捷键(从eclipse转过来的) 一般情况下,查看类的子类Ctrl+T 如何以树的形式查看完整继承关系,快捷键:F4 效果如下: 尤其从根节点查看的时候,完 ...

  9. C++笔记-类层次结构

    多重继承 一个类采用多个直接基类的情况称为多重继承,采用一个基类就是单继承. 两个基类中可能会出现名字一样的成员函数 在派生类中就必须消解这两个基类的成员函数带来的歧义性,最好的方法:在派生类中重新定 ...

随机推荐

  1. 下载网易云音乐的MV

    网易云音乐有很多经典视频, 但是苦于没有下载按钮...今天就记录下如何保存MV到本地, 又get一项新技能!!! 一. 安装360极速浏览器(非安利) 二. 打开网易云音乐客户端, 点击"等 ...

  2. swift3 与 OC 语法区别

    1.Swift还增加了Objective-C中没有的类型比如元组(Tuple). 元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值. 元组(tuples)把多个 ...

  3. ASP.NET MVC多语言 仿微软网站效果(转)

    本文转自: https://blog.csdn.net/Cooldiok/article/details/7831351 2017年10月22日 21:31:22 Cooldiok 微软作为ASP.N ...

  4. MySQL 5.6新特性 -- Multi-Range Read

    如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索 ...

  5. Json返回结果为null属性不显示解决方法

    返回时null属性不显示:String str = JSONObject.toJSONString(obj); 返回为null属性显示:String str = JSONObject.toJSONSt ...

  6. 菜鸟要做架构师(二)——java性能优化之for循环

    完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...

  7. 删除最少字符生成Palindrome

    看到一个哥们G家电面试题,求删除最少字符生成Palindrome.大神们都在讨论dp,我完全想不到. 放一个没优化的DFS. 乐神说是O(n3)复杂度, 有机会的话要减少使用substring,并且要 ...

  8. Orchard CMS -Migration文件更新后数据库不更新的问题 new properties not updating after migrationData migration is not working?

    Orchard CMS - new properties not updating after migrationData migration is not working? If your mapp ...

  9. QT 中Widgets-Scene3d例子学习

    QT中自带的例子widgets-scene3d实现在基于Widget的应用程序中使用qml 3d场景的功能,我在此基础上,将basicshapes-cpp的例子加以嵌入: 相关代码如下:  C++ C ...

  10. [AWS] Deploy react project on EC2

    如何在aws部署项目 申请到亚马逊AWS免费账户后,我们可以拥有很多的免费云服务产品项目,其中包括: EC2云服务器. Amazon S3存储. Amazon RDS数据库. Amazon Cloud ...