品图:WPF体系结构图(黑色字体为抽象类,从上至下派生)
-
线程分配系统(System.Threading.DispatcherObject)
线程分配系统提供一个Dispatcher属性,VerifyAccess 和 CheckAccess 方法。线程分配系统位于所有 WPF 类中顶端,几乎每一个 WPF 元素都派生于此类。在此之前,请先了解一下小知识。
WPF 应用程序启动后,会有两条固定的线程,一条是用来处理呈现,一条用来管理 UI 。前者暂时不谈,后者UI线程才是重点。我不喜欢用太官方生硬的文字来描述一样东西。传统编程中,创建一个 Thread 是一个很麻烦的过程,其中要考虑到“线程安全”,如:一个主线程上的Label(线程 A 上的控件),创建一个线程(线程 B 的控件)执行一些操作后更新 Label 的文本,当执行到这一步时,系统就会告诉你,异常了!线程间操作无效。当然,解决方案也是有的。
很显然,创建一个多线程是一个既麻烦又不安全的步骤。 WPF 为我们省略了很多事情,只要是派生于 System.Threading.DispatcherObject 对象的派生类,都会有一个 Dispatcher 属性,该属性可以安全地异/同步调用委托( p1 ),并且在线程中可以安全的访问其他控件。为什么 System.Threading.DispatcherObject 会排在顶端?原因就在此!当程序运行后, UI 线程对 Dispatcher 的对象内的工作项( p2 )进行排队。 Dispatcher 基于优先级选择工作项,并运行每一个工作项,直到完成所有工作项。每个 UI 线程至少都会有一个 Dispatcher ,并且每个 Dispatcher 只能在一个线程中执行工作项。所有的 UI 控件的每一个行为动作,都会发送至 UI 线程,这个线程依据发送过来的消息优先级进行排队,然后逐一处理。简单的讲:很无耻地将全部工作托付给一个人去做。
P1:同步: DispatcherObject.Invoke,异步:DispatcherObject.BeginInvoke。区别:同步调用的线程将被阻塞,直到返回结果,而异步调用则直接开始。
P2:所谓的工作项便是在窗体上的任何操作:如告诉 UI 线程,鼠标移入窗体了,鼠标单击 button1 了,鼠标右击等……
-
[依赖项]属性系统(System.Windows.DependencyObject)
不知读者是否具有HTML基础?如果没有,XML总有吧?在整个WPF中,最重要的地方,就是属性。MS的意思很简单,可以实现无任何代码的程序(动画)。也就是说,你可以不用码入任何.NET的代码,仅需XAML就可以实现许多特效。(有些地方甚至比代码更加精炼,神来之笔!)
WPF 的一个核心原理:更具声明性且“以属性为核心”的编程模型。 依赖属性主要有两部分:依赖项属性、附加属性。若想探讨更高级的话题,请参阅《WPF的属性系统》。
-
[依赖项]属性系统(System.Windows.DependencyObject)
不知读者是否具有HTML基础?如果没有,XML总有吧?在整个WPF中,最重要的地方,就是属性。MS的意思很简单,可以实现无任何代码的程序(动画)。也就是说,你可以不用码入任何.NET的代码,仅需XAML就可以实现许多特效。(有些地方甚至比代码更加精炼,神来之笔!)
WPF 的一个核心原理:更具声明性且“以属性为核心”的编程模型。 依赖属性主要有两部分:依赖项属性、附加属性。若想探讨更高级的话题,请参阅《WPF的属性系统》。
不知读者是否具有HTML基础?如果没有,XML总有吧?在整个WPF中,最重要的地方,就是属性。MS的意思很简单,可以实现无任何代码的程序(动画)。也就是说,你可以不用码入任何.NET的代码,仅需XAML就可以实现许多特效。(有些地方甚至比代码更加精炼,神来之笔!)
不知读者是否具有HTML基础?如果没有,XML总有吧?在整个WPF中,最重要的地方,就是属性。MS的意思很简单,可以实现无任何代码的程序(动画)。也就是说,你可以不用码入任何.NET的代码,仅需XAML就可以实现许多特效。(有些地方甚至比代码更加精炼,神来之笔!)
不知读者是否具有HTML基础?如果没有,XML总有吧?在整个WPF中,最重要的地方,就是属性。MS的意思很简单,可以实现无任何代码的程序(动画)。也就是说,你可以不用码入任何.NET的代码,仅需XAML就可以实现许多特效。(有些地方甚至比代码更加精炼,神来之笔!)