摘要: 依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符。 但对于依赖项属性而言,属性执行逻辑的重新定义并不能存在于CLR属性包装中:WPF内部对依赖项属性的实现要求依赖项属性的CLR包装实... 阅读全文
posted @ 2015-03-19 22:37 loveis715 阅读(1206) 评论(0) 推荐(1) 编辑
摘要: 依赖项属性元数据 在前面的章节中,我们已经介绍了WPF依赖项属性元数据中的两个组成:CoerceValueCallback回调以及PropertyChangedCallback。而在本节中,我们将对其它元数据属性进行讲解。 首先让我们来看看元数据对默认值的支持。在元数据的构造函数中,软件开发人员... 阅读全文
posted @ 2015-03-18 23:25 loveis715 阅读(2238) 评论(0) 推荐(2) 编辑
摘要: 属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解。如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求。但是事情往往并非如此完美。在一个系统中,很少有属性是独立存在的,在WPF这种描述界面组成的类库中更是如此。例如一个属性的取值可能受其它众多属... 阅读全文
posted @ 2015-03-17 21:12 loveis715 阅读(1401) 评论(0) 推荐(1) 编辑
摘要: 本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码。但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的介绍能触及到属性系统的方方面面。而且其内部实现代码涉及到了众多的内部算法,对它们进行讲解反而可能... 阅读全文
posted @ 2015-03-16 23:29 loveis715 阅读(2405) 评论(12) 推荐(6) 编辑
摘要: 我们都知道,WPF是一个属性驱动的编程框架。在使用WPF编程的时候,您可以以任意顺序设置这些属性。相应地,WPF则会自动根据这些属性变化执行外观的变更。 这里就存在一个问题:WPF的依赖项属性在发生更改时常常需要执行某个特定功能,如在更改width属性时更新控件的布局。而在一段代码中,我们可以多次对这种具有回调功能的WPF依赖项属性进行设置。那么问题来了:这些回调功能是否会执行多次?这些执行会不会影响WPF的执行效率呢?答案是不会。WPF内部使用了一种模型避免了由于设置多个属性而导致的某一机制重复执行。由于微软并没有为该模型提供一个官方命名,因此我们在这里为其命名为BeginInvoke... 阅读全文
posted @ 2013-01-03 01:53 loveis715 阅读(7257) 评论(4) 推荐(5) 编辑
摘要: 引子 “请写一个Singleton。”面试官微笑着和我说。 “这可真简单。”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public: 4 static Singleton& Instance() 5 { 6 ... 阅读全文
posted @ 2012-07-18 23:35 loveis715 阅读(30850) 评论(64) 推荐(58) 编辑
摘要: 最近才开始研究HTML以及安全问题。如果有什么说得不对的地方,望请指出。 在网络应用安全中,XSS可能是最常见,范围最大,所包含攻击方法最多,同时也是最难以理解的一种攻击。在OWASP所列出的十大网络应用安全风险中,其排名第二位,仅次于SQL Injection。 而在本篇文章中,我们将一步一步深入挖掘XSS的攻击流程,攻击手段,以及防御方法等各个方面。XSS示例 在深入了解XSS的各个方面之前,让我们首先了解XSS攻击到底是怎样完成的。 就以一个博客应用为例。其常常需要允许读者对博主的文章进行评论。在输入评论的编辑栏中,我们可以输入对该文章的评论,也可以输入以下HTML标记:1 ... 阅读全文
posted @ 2012-07-13 02:31 loveis715 阅读(9372) 评论(11) 推荐(9) 编辑
摘要: 记得在刚刚接触WPF时,我对它所提供的一个特性印象尤为深刻:在程序运行大规模计算时,程序的界面将不会停止绘制,并能够在需要进行界面的刷新时进行正确的绘制。那么,这种绘制特性是否能在WPF执行大规模计算时对用户的输入进行响应呢?让我们来做个试验吧。 打开示例工程并运行,您会看到控制窗口(Control Window)。点击Sychronous work所对应的开始键,以开始执行以下代码:1 public void StartSynchronousWork(object sender, RoutedEventArgs e)2 {3 int counter = 0;4 whil... 阅读全文
posted @ 2012-04-30 23:05 loveis715 阅读(12585) 评论(8) 推荐(8) 编辑
摘要: 在原来的公司中,编写自定义控件是常常遇到的任务。但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件。那我们应该怎样宰自定义控件开发中使用路由事件?我们将在这篇短文中对该问题进行讨论。路由事件简介 谈到路由事件,我想首先我们就需要问自己一个问题。在.net已经支持事件的情况下,为什么WPF还额外提供了对路由事件的支持?这是因为在WPF开发模型下,原始的CLR事件已经不能满足开发的要求,从而导致对事件的处理异常繁琐: 首先就是控件的封装。WPF中,我们可以将一个控件作为另一个控件的子控件,从而呈现丰富的效果。例如我们可以在一个Button中包含一个图像。在这种情况下... 阅读全文
posted @ 2012-04-10 23:15 loveis715 阅读(26575) 评论(6) 推荐(9) 编辑
摘要: 在为WPF控件定义模板时,如果我们为一个元素指定了一个名称,那么我们就可以在模板的定义中通过该名称引用该元素了。但是为何我们不能用这种方法引用在同一个XAML中定义的其它界面元素呢?对于这个问题,您需要了解WPF所提供的名称管理机制。XAML中的NameScope 首先来讲讲WPF的名称管理机制NameScope,也即是名称范围。名称范围主要提供了两种功能:记录XAML名称与界面元素实例之间的关联关系;防止名称冲突。可以说,第二种功能是第一种功能实现时所产生的副作用。而在XAML中引用某个名称时,WPF会自动使用相应的NameScope执行对名称的查找。 那么,WPF的名称范围是如何在... 阅读全文
posted @ 2012-04-09 23:47 loveis715 阅读(4236) 评论(0) 推荐(1) 编辑
摘要: 看到这个标题,您可能会在脑中产生一个疑问:Adorner是什么?Adorner是WPF窗口中独立的一层,支持在界面元素之上执行独立的绘制及用户交互。可以说,Adorner在您的WPF程序中无处不在。在WPF中,从编辑框控件中光标的显示和选中效果的支持,到具有数据焦点的控件所具有的虚线外框,都是通过Adorner实现的。什么是Adorner 鉴于您可能不熟悉Adorner这种组成,因此我在这里单独列出一节文字对其进行介绍。首先请您想象一下WPF如何对编辑框中光标和选中效果的支持: 按照较为常见的WPF开发方式,您可能需要为这两种情况分别提供一个非常繁琐的解决方案。 对于对光标的支持而言... 阅读全文
posted @ 2012-03-31 22:30 loveis715 阅读(24342) 评论(10) 推荐(14) 编辑
摘要: WPF提供了一系列预定义组件以供UI开发人员使用。但软件开发人员仍常常需要自行编写满足特定要求的控件。本文就将以Spinner控件为例,讲解如何以派生方式完成自定义控件的编写。一.动手前的思考 在着手开始编写控件之前,我们需要思考Spinner需要以怎样一种方式实现?MSDN建议使用三种控件实现方式:从UserControl类派生,从Control类派生以及从FrameworkElement类派生。 要正确地从这三种方式中作出选择,软件开发人员首先需要了解这些实现方法的特点。从UserControl类派生和WPF应用程序开发模型非常类似:控件仅仅由现有控件组成,并通过XAML描述。其支... 阅读全文
posted @ 2012-02-08 00:08 loveis715 阅读(9302) 评论(4) 推荐(8) 编辑
摘要: 在WPF中,DataSourceProvider是一个较为特别的类型。其提供了对复杂数据获取逻辑的支持。例如该类的派生类XmlDataProvider提供了对XML数据进行分析的支持,而ObjectDataProvider则允许软件开发人员调用创建数据实例的函数。 也正是由于这些类型的使用较为生僻,因此许多软件开发人员并不能很好地使用它们。实际上,DataSourceProvider是一个非常强大的数据源框架,允许您通过继承的方式为不同的数据源,如SQL Server,提供绑定支持。 在下面的介绍中,本文主要分析DataSourceProvider作为数据源框架所提供的功能以及如何在各... 阅读全文
posted @ 2012-02-07 02:25 loveis715 阅读(3356) 评论(0) 推荐(1) 编辑
摘要: 在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等。那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢。这就是本文将要讨论的内容。一.从标记扩展的分析说起 在WPF中,软件开发人员需要以类似于XML的格式编写XAML。如下面代码所示:1 <Window …>2 <StackPanel …>3 <TextBlock …/>4 </StackPanel>5 </Window> 但是在实际开发过程中,我们却常常需要使用标记扩展,如对绑定的使用:1 < 阅读全文
posted @ 2012-02-06 23:01 loveis715 阅读(7439) 评论(1) 推荐(7) 编辑
摘要: 写在前面:本文实际上是在开发过程中解决特殊问题的一个总结。由于我并非MS员工,因此可能有讲解得不尽正确的地方,望您指出。为了您阅读方便,请对照.net源码进行阅读(源码获取方式已列出)。 相信您在使用WPF的过程中也遇到过这种问题:如果UI线程执行了非常耗时的计算并尝试在执行过程中更改UI组成中的内容,WPF界面并不会立即发生更改。对于需要给出即时信息的用户需求而言,WPF的这种延迟绘制功能反而给软件开发人员带来了极大的不便。当然,从根本上解决该问题的方法就是将该耗时计算单独置于工作线程中。只是这种解决方案常常由于某些限制无法施行:对于某些遗留代码来说,将耗时计算单独抽离是一件较为复杂的... 阅读全文
posted @ 2012-01-11 22:54 loveis715 阅读(6669) 评论(12) 推荐(3) 编辑
摘要: 本想博客以每周一篇的速度更新,却未曾料到最近几周忙到了没有时间坐下来写点东西的程度。 而这一篇,也因为写得较为匆忙,望您指出疏漏之处。 至于本文参考,可能部分来自于EC中的某个条款,并适当地加以补充。 在C++中,为基本类型定义操作符是最常见的任务。例如为一个自定义类型提供比较操作符,以允许其作为STL容器set的元素类型。在本文中,我们不讨论定义操作符的各种语法,而是简单介绍定义操作符过程中需要注意的一些问题。 首先需要明确的就是操作符的好处。相较于成员函数,操作符拥有更强的语义特征:一般情况下,一个操作符常常具有固定的意义。根据该固定意义为类型定义操作符可以使操作逻辑更为清晰。... 阅读全文
posted @ 2012-01-08 23:03 loveis715 阅读(2233) 评论(1) 推荐(0) 编辑
摘要: 写在前面:这仍然是一些没有经过严格审阅的文字。虽然我的确执行了初稿、复稿以及审阅等一系列用以保证文章质量的方法,但是仍然担心其中是否有错误。希望您能帮助指出,以在下一次我在版本更新时进行修正。所有的错误,包括别字、概念不清(表述错误等)、边缘情况没有覆盖等,您认为有必要提及的各个方面,都可以是我们深入讨论的话题。三.其它问题 在绑定中,软件开发人员可以通过Source、ElementName以及RelativeSource等属性标明绑定源。实际上,对这些属性的使用实际上都是完成了对DataContext属性所记录的默认绑定源的重写。DataContext属性用来记录用户界面元素在参与数据绑定. 阅读全文
posted @ 2011-12-16 02:38 loveis715 阅读(4962) 评论(1) 推荐(3) 编辑
摘要: 写在前面:这仍然是一些没有经过严格审阅的文字。虽然我的确执行了初稿、复稿以及审阅等一系列用以保证文章质量的方法,但是仍然担心其中是否有错误。希望您能帮助指出,以在下一次我在版本更新时进行修正。所有的错误,包括别字、概念不清(表述错误等)、边缘情况没有覆盖等,您认为有必要提及的各个方面,都可以是我们深入讨论的话题。 在前面对绑定数据源进行介绍的过程中,本文都是使用Binding类的Source属性指定数据源的。使用该属性访问绑定源具有一些限制:软件开发人员无法引用XAML中定义的元素或依某种规律查找与绑定源相关的元素。因此除了Source属性之外,WPF还提供了ElementName、Rela. 阅读全文
posted @ 2011-12-15 01:57 loveis715 阅读(9015) 评论(0) 推荐(2) 编辑
摘要: 写在前面:这仍然是一些没有经过严格审阅的文字。虽然我的确执行了初稿、复稿以及审阅等一系列用以保证文章质量的方法,但是仍然担心其中是否有错误。希望您能帮助指出,以在下一次我在版本更新时进行修正。所有的错误,包括别字、概念不清(表述错误等)、边缘情况没有覆盖等,您认为有必要提及的各个方面,都可以是我们深入讨论的话题。 绑定是WPF程序中所不可或缺的一项技术,同时其其强大的功能及灵活性也导致软件开发人员在编写绑定的过程中产生这样或那样的疑问。本文将会把精力主要集中在绑定中的重要惯用法以及如何(how)、为什么(why)以及何时(when)这样使用。一.简介 为了后面行文顺利,在进入正文之前,我们.. 阅读全文
posted @ 2011-12-11 17:39 loveis715 阅读(17677) 评论(0) 推荐(3) 编辑
摘要: 写在前面:本文为即兴而作,因此难免有疏漏和词不达意的地方。在这里,非常期望您提供评论,分享您的想法和建议。 这是一篇介绍如何在WPF中实现拖放功能的短文。 首先要读者清楚的一件事情是:拖放主要分为拖放源和拖放目标两个组成。拖放源和拖放目标各自拥有不同的事件。软件开发人员需要在适当的事件中完成相应功能。 试想拖放是如何操作的:用户选中一个界面元素,并在鼠标左键按下的情况下移动鼠标,最后,在到达拖放目标时松开鼠标左键,从而完成数据拖放的全过程。从程序编写的角度来看,用户需要在左键选中项目并按下的情况下移动以启动拖放,并在鼠标移动的过程中给出当前拖放状态的外观回馈,并在松开鼠标时尝试将项目... 阅读全文
posted @ 2011-12-05 23:54 loveis715 阅读(30219) 评论(1) 推荐(7) 编辑