小序:
按照惯例,我会在年末的最后一篇文章里感谢所有帮助过我的人们。今年也不例外,只是形式简单一些。
祝所有帮助过我的朋友、同事、学生和兄弟姐妹们——2009年身体健康、平安快乐、财源滚滚。愿2009年的中国,平安祥和、远离各种灾难,大家的工资涨上去、房价降下来,金融危机早点结束。
祝我的父亲母亲,健康长寿!
正文:
……上文省略若干千字……
还剩下x:Class="MyFirstWpfApplication.Window1"这个Attribute。x:前缀说明这个Attribute来自于x映射的名称空间——前面我刚刚分析过,这个名称空间是对应XAML解析功能的。x:Class,顾名思义它与类有此关系,是何种关系呢?让我们做个有趣的实验:
首先,我们把x:Class="MyFirstWpfApplication.Window1"这个Attribute删掉,再到Window1.xaml.cs文件里,把InitializeComponent();这个函数调用也删掉。编译程序,你会发现程序仍然可以运行。为什么呢?打开App.xaml这个文件,你能发现这样一个Attribute——StartupUri="Window1.xaml",它是在告诉编译器把由Window1.xaml解析后生成的窗体作为程序启动时的主窗体。也就是说,只要Window1.xaml文件能够被正确解析成一个窗体,程序就可以正常运行。
然后,我们恢复x:Class这个Attribute,更改它的值为x:Class="MyFirstWpfApplication.WindowABC"。编译之后,仍然可以正确运行。这时,我们使用IL Disassembler(中间语言反编译器)打开项目的编译结果,你会发现在由项目编译生成的程序集里包含一个名为WindowABC的类。
      这说明,x:Class这个Attribute的作用是当XAML解析器将包含它的标签解析成C#类后,这个类的类名是什么。这里,我们已经触及到的XAML的本质。前面我们已经看到,示例代码的结构就是使用XAML语言直观地告诉我们,当然被设计的窗体是在一个<Window>里嵌套一个<Grid>。如果使用C#来完成同样的设计呢?显然,我们不可能去更改Window这个类,我们能做的是从Window类派生出一个类来(比如叫WindowABC),再为这个类添加一个Grid类型的字段,然后把这个字段在初始化的时候赋值给派生类的内容属性。代码看起来大概是这样:
    using System.Windows;
    using System.Windows.Controls;
 
    class WindowABC : Window
    {
        private Grid grid;
 
        public WindowABC()
        {
            grid = new Grid();
            this.Content = grid;
        }
    }
      最后,让我们回到最初的代码。你可能会问:在XAML里有x:Class="MyFirstWpfApplication.Window1",在Window1.xaml.cs里也声明了Window1这个类,难道它们不会冲突吗?仔细看看Window1.xaml.cs中Window1类的声明就知道了——在声明时使用了partial这个关键字。使用partial关键字,可以把一个类分拆在多处定义,只要各部分代码不冲突即可。显然,由XAML解析器生成的Window1类在声明时也使用了partial关键字,这样,由XAML解析成的类和C#文件里定义的部分就合而为一了。正是由于这种partial机制,我们可以把类的逻辑代码留在.cs文件里、用C#语言来实现,而把那些与声明及布局UI元素相关的代码分离出去,实现UI与逻辑分离。并且,用于绘制UI的代码(比如声明控件类型的字段、设置它们的外观和布局等)也不必再使用C#语言——使用XAML和XAML编辑工具就能轻松搞定!

本文转自 水之真谛 51CTO博客,原文链接:http://blog.51cto.com/liutiemeng/129503,如需转载请自行联系原作者

深入浅出WPF——x:Class详解相关推荐

  1. 深入浅出 spring-data-elasticsearch - 基本案例详解(三

    『  风云说:能分享自己职位的知识的领导是个好领导. 』 运行环境 :JDK 7 或 8,Maven 3.0+ 技术栈 :SpringBoot 1.5+, Spring Data Elasticsea ...

  2. WPF Binding(绑定)详解

    Binding概念理解: WPF为了实现了UI与数据逻辑的解耦,将UI从数据逻辑中分离出来形成Xaml文件,而UI与数据逻辑之间的联系则通过Bingding来实现.Bingding就像UI与数据逻辑之 ...

  3. WPF WinAPI 编程详解(四 实例 )

    QQ/微信定时发送消息 1--检测QQ/微信窗口 今天先来说说第一步:怎样检测QQ和微信窗口. 1,思路:首先获取QQ和微信的进程ID,中间要注意两个注意点 <1>请保证要群发的QQ/微信 ...

  4. 空WPF项目元素详解 by:凉游浅笔深画眉 / Net7Cracker

    我们在VisualStudio2010创建了一个空WPF程序,现在我们来对这个空WPF程序的所有元素进行讲解! 1.<Window x:Class="WpfApplication1.M ...

  5. WPF 依赖属性详解【转】

    我在上传些代码的时候,有时候会遇到“git did not exit cleanly (exit code 128)”错误.通常都是网络原因.

  6. WPF入门教程详解1——label、TextBlock、Button、Border、RadioButton、CheckBox、 数据绑定、案例、ToolTip、GroupBox、Expand、Fram

    视频地址:https://www.bilibili.com/video/BV1iY411w7zD/?p=3&spm_id_from=pageDriver&vd_source=5dc01 ...

  7. 深入浅出,一文详解*毫米波*雷达原理及应用技术

    专栏解读: 本专栏针对自动驾驶技术(智能网联汽车技术)中的感知技术进行详细介绍. 包含: 汽车感知技术概念 多传感器融合原理 各传感器原理及应用(超声波,毫米波,激光雷达,视觉传感器,全球定位系统) ...

  8. [NLP] 深入浅出 word2vec 词向量详解

    Word2vec 词向量 前置知识:需要理解基本的MLP 多层感知机(全连接神经网络) 和DL.数学相关基础知识 One-hot encoding 独热编码 刚开始,人们用one-hot编码来表示词, ...

  9. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至    罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...

最新文章

  1. gitlab的升级【二】旧数据的备份和新数据的恢复
  2. AOP||动态代理||AOP专业术语;
  3. SQL Server 2000 安装中的“一般性网络错误”
  4. 一行代码不用写,就可以训练、测试、使用模型,这个 star 量 1.5k 的项目帮你做到...
  5. 面向.NET开发人员的Dapr——机密
  6. ICON素材|装饰图标设计的技巧
  7. 使用tensorflow实现机器学习中的线性拟合
  8. 判断一个树是否是平衡二叉树
  9. AD软件系统参数的一些基本设置(Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿)
  10. cass 河流走向 符号_CASS地形图数据预处理标准
  11. 微信开放平台、微信公众平台和微信商户平台
  12. 基于AE的GIS二次开发作业文档
  13. 重建同义词+oracle,oracle 创建同义词
  14. 树莓派如何刷RetroPie,制作一个复古游戏机
  15. echarts图表x轴文字过多时换行显示以及图表画区域背景颜色
  16. 《Python编程:从入门到实践》最高温度, 最低温度可视化
  17. 【安富莱】RTX嵌入式操作系统教程发布,支持F103,F407和F429,含81个配套例程(2017-10-17)...
  18. sdlc 瀑布式 生命周期_管理信息系统中的系统开发生命周期(SDLC)
  19. java必备的开发知识和技能
  20. ESP8266驱动1.44寸TFT屏幕(例程问题)

热门文章

  1. 如果asp.net mvc中某个action被执行了两次,请检查是不是以下的原因
  2. 我的软考之路(九)——总结篇
  3. mongoDB 入门指南、示例
  4. PHP自动加载类—__autoload()和spl_autoload_register()
  5. Linux tail 命令详解
  6. memset函数详细说明
  7. 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现
  8. 解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题
  9. 【linux】用户和组的管理:添加、修改、删除(useradd usermod userdel groupadd groupdel)
  10. 【POCO】POCO学习总结(三)——交叉编译