2011年11月13日
摘要: WPF相关的项目内容包含在App.Xaml和Window1.xaml中,这些文件中包含了相当重要的Application对象和Window对象。Window类 Window是传统应用程序的主要元素,用来包含应用程序的内容。WPF Window其实只是一个包装过的Win32窗口。操作系统无法区分具有WPF内容的窗口和具有Win32内容的窗口间的差别,它会以相同的方式在非客户端区域进行渲染。 Window提供了一种对Win32窗口的直接抽象,其中提供了许多简单的方法和属性。在完成Window初始化后,可以调用Show来显示它,调用Hide让它隐藏,调用Close来完全的关闭它。 Wind... 阅读全文
posted @ 2011-11-13 22:07 辛勤的代码工 阅读(2310) 评论(0) 推荐(0) 编辑
摘要: 标准WPF控件在不同的Windows支持的主题下有不同的外观。如果WPF遇到了一些求知的新主题,WPF会自动把它当作Classic主题来对待。内容控件 内容控件是只允许包含单一项的简单控件。内容控件都继承自System.Windows.Controls.ContentControl,它们拥有只含一项的Object类型的Content属性。 因为内容控件的单一项可能是任意对象,所以它可能包含一个很大的对象树。它只能有一个直接子节点。除了Content以外,ContentControl类另外一个有趣成员是HasContent布尔型属性。如果Content为空(Content == null... 阅读全文
posted @ 2011-11-13 15:43 辛勤的代码工 阅读(3850) 评论(0) 推荐(0) 编辑
  2011年11月12日
摘要: 逻辑树与可视树 XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性。在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树。 WPF用户界面的逻辑树也并不一定用XAML创建,它完全可能用过程式代码来实现。 逻辑树的概念很直观,但为什么要关注它呢?因为几乎WPF的每一方面(属性、资源、事件等)都有与逻辑树相关联的行为。如,属性值有时会沿着树自动传递给子元素,而触发的事件可以自底向上或自顶向下遍历树。 与逻辑树类似的一个概念是可视树。可视树基本上是逻辑树的扩展,在可视树中,节点都被打散,分放到核心可视组件中。可视树提供了一些详细的可视化实现,而不是把每个元素当作一个“黑盒”... 阅读全文
posted @ 2011-11-12 16:31 辛勤的代码工 阅读(1920) 评论(0) 推荐(3) 编辑
  2011年11月6日
摘要: XAML定义 XAML是一种相对简单、通用的声明式编程语言,它适合于构建和初始化.NET对象。 XAML仅仅是一种使用.NET API的方式,把它与HTML、可伸缩向量图形(SVG)或其他特定领域的格式或语言作比较是完全错误的。XAML由一些规则(告诉解析器和编译器如何处理XML)和一些关键字组成,但它自己没有任何有意义的元素。因此,如果在没有WPF这样的框架的基础上讨论XAML,就如同在没有.NET Framework的基础上讨论C#一样。 XAML在WPF中扮演的角色通常是令人困惑的,因此第一件要搞清楚的事情是WPF和XAML可以独立使用,它们并不是互相依赖的。虽然XAML最初是为W... 阅读全文
posted @ 2011-11-06 22:13 辛勤的代码工 阅读(34255) 评论(5) 推荐(10) 编辑
  2011年11月5日
摘要: 使用APM执行受计算限制的异步操作 我们可以通过APM来调用任何方法,但首先,我们需要定义一个与我们希望调用的方法拥有相同签名的方法。以计算1至n间总和的方法为例(这是一个计算密集的任务,它不执行任何I/O操作)。private static UInt64 Sum(UInt64 n){ UInt64 sum = 0; for(UInt64 i = 1; i <= n; i++) { checked { //在此使用了checked代码,以便于当结果sum与类型UInt64不符时抛出一个异常 sum +... 阅读全文
posted @ 2011-11-05 19:37 辛勤的代码工 阅读(674) 评论(0) 推荐(0) 编辑
摘要: 简介 执行异步操作是构建高性能、可扩展应用程序的关键,它允许我们能够用非常少的线各执行许多操作。MS CLR团队设计了一种模式,可以让开发人员方便地利用这种能力,这种模式称为异步编程模式(APM)。 在FCL中许多类型都支持APM,如下面一些具体例子:所有派生自System.IO.Stream并与硬件设计通信的类都提供了BeginRead和BeginWrite方法。System.Net.Dns类提供了BeginGetHostAddresses、BeginGetHostByName、BeginGetHostEntry和BeginResolve方法。所有派生自System.Net.WebReq.. 阅读全文
posted @ 2011-11-05 18:52 辛勤的代码工 阅读(1307) 评论(0) 推荐(0) 编辑
  2011年7月10日
摘要: 定期执行受计算限制的异步操作 System.Threading命名空间中定义了一个Timer类,可使用这个类让CLR定期地调用方法。构建Timer类的实例时,实际是在告诉CLR我们希望一个方法在指定的时间内被再次调用。Timer类提供了几个非常相似的构造器:public sealed class Timer : MarshalByRefObject, IDisposable{ public Timer(TimerCallback callback, Object state, int dueTime, int period); public Timer(TimerCallback callba 阅读全文
posted @ 2011-07-10 23:42 辛勤的代码工 阅读(949) 评论(0) 推荐(0) 编辑
摘要: 高效线程使用圣典 严格来讲,线程的系统开销很大。系统必须为线程分配并初始化一个线程内核对象,还必须为每个线程保留1MB的地址空间(按需提交)用于线程的用户模式堆栈,分配12KB左右的地址空间用于线程的内核模式堆栈。然后,紧接着线程创建后,Windows调用进程中每个DLL都有的一个函数来通知进程中所有的DLL操作系统创建了一个新的线程。同样,销毁一个线程的开销也不小:进程中的每个DLL都要接收一个关于线程即将“死亡”的通知,而且内核对象及堆栈还需释放。 如果一台计算机中只有一个CPU,那么在某一时刻只有一个线程可以运行。Windows必须跟踪记录线程对象,而且是不停地跟踪记录每个线程对象。Wi 阅读全文
posted @ 2011-07-10 22:18 辛勤的代码工 阅读(868) 评论(0) 推荐(0) 编辑
  2011年6月25日
摘要: 为理解可空类型是如何工作的,我们来看一看System.Nullable<T>类,它是在FCL中定义的。[Serializable, StructLayout(LayoutKind.Sequential)]public struct Nullable<T> where T : struct{ //这两个字段表示状态 private Boolean hasValue = false; //假定null internal T value = default(T); //假定所有比特都是零 public Nullable(T value) { this.value = valu 阅读全文
posted @ 2011-06-25 18:30 辛勤的代码工 阅读(745) 评论(1) 推荐(0) 编辑
  2011年6月23日
摘要: 泛型接口 没有泛型接口,每次试图使用一个非泛型接口(如IComparable)来操纵一个值类型时,都会进行装箱,而且会丢失编译时的类型安全性。这会严重限制泛型类型的应用。所以,CLR提供了对泛型接口的支持。一个引用类型或值类型为了实现一个泛型接口,可以具体指定类型实参;另外,一个类型也可以保持类型实参的未指定状态来实现一个泛型接口。来看一些例子: 以下泛型接口定义是作为FCL的一部分发布的:public interface IEnumerable<T> : IDisposable, IEnumerator { T Current { get; }} 下面这个示例实现了上述泛型接口, 阅读全文
posted @ 2011-06-23 23:14 辛勤的代码工 阅读(1683) 评论(0) 推荐(1) 编辑