WPF框架剖析,从头开始自己写WPF框架
首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版。因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们学习。
创建一个WPF需要引用的最基本的DLL
1、PersentationCore WPF的核心类库
2、PersentationFramework 封装了与WPF控件相关类型的类库
3、System.Xaml XAML解析的类库
4、WindowBase Window窗体相关的类库
引入了这四个类库之后 我们就可以创建自己的WPF App了
Demo:
class SimpleWPF{//与Console、Winform一样 WPF自身也是单线程模型[STAThread]static void Main(){//Window 是WPF中标准的窗体呈现方式 Window mainWindow = new Window();mainWindow.Title = "这是一个简单的WPF应用";//Application类型用于创建一个消息循环 使用户可以接受来自输入设备的输入Application app = new Application();Console.WriteLine("Simple WPF Running");app.Run(mainWindow);#region 等效方式//mainWindow.Show();//显示窗体
//app.Run();//先建立消息循环
#endregion } }
在这个例子里 大家应该可以看到 在单线程的主入口点中,我声明了一个Window对象 和一个Application对象。
这两个对象是做什么的呢?我在这里解释下
System.Windows.Application对象 是创建一个消息循环,用以接受用户的各类输入事件,以及阻止控制台程序的结束
System.Windows.Window对象 是WPF中标准的窗体类型。
这里提供了一个继承关系的树形截图
从此截图可以看出 Window类型实际是一个ContentControl类型。 对于Control类型的讲解,我们会后期的文章中说明
Window类型还有一个孪生兄弟 叫UserControl,位于System.Windows.Controls命名空间下,UserControl与Window不同,Window会被视为窗体,而UserControl顾名思义被视为一个封装好的用户控件。
Application在运行的时候,可以创建一个默认Window窗体并直接调用窗体的Show()方法进行显示,也可以由Window调用自己的Show()并调用Application的Run()方式来完成窗体的显示以及消息循环的建立。同时Application会将第一个调用了Show()的窗体认作MainWindow 并可以通过Application的MainWindow属性获取及设置新的MainWindow
因为程序是通过控制台来创建的GUI,我们在运行时除了会看到Window窗体,还会看到Console控制台。我们可以通过Console.WriteLine()来输出各类调试信息,因此在程序发布之前 建议使用这种方式来进行调试。如果不希望看到Console,可以修改项目属性为Windows应用程序,如下图
以上就是如何创建一个简单的WPF应用了,很多人可能还会疑惑,这么创建的WPF应用程序跟拿模版创建的差距咋就那么大呢,下面我用一个例子来告诉大家,模版都做了什么,它的好处在哪。
这是一个模版生成的WPF应用程序。
我们来模拟它
MainWindow 我们只关心他的cs文件, MainWindow类型也是继承自Window类型,在MainWindow类型里 我们可以重写On[Event]行为来达到对各种Window窗体的事件的处理
App 分为两部分 一部分为Xaml 其中有个重要的属性StarupURI 定义了主窗体的类型,另一部分是App.Xaml.cs 继承自Application类型,让我们可以使用Application生命周期中产生的各种事件
App生命周期中有三个特别重要的事件
OnStartup 创建消息循环时触发
OnExit 结束消息循环时触发
OnSessionEnding 系统进行关机操作时触发
在这个例子里 我们将对窗口的创建 延迟到了Application 的 Startup事件中,也就是由Application来管理窗体的创建和销毁
上代码:
主入口点 负责创建Application消息循环
class Programs
{
[STAThread]
static void Main()
{
App app = new App();
Console.WriteLine("App.Run()");
app.Run();
}
}
Application类,我们在Stratup事件中创建Window实例,并且向控制台中输出创建信息
public class App : Application{/// <summary>/// 程序运行时触发的事件/// </summary>/// <param name="e"></param>protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);WPF_ApplicationAndWindow.NormalWPF.MainWindow mainWindow = new MainWindow();Console.WriteLine("Application StartUp And Main Window.Show()");mainWindow.Show();}//关机时触发的事件protected override void OnSessionEnding(SessionEndingCancelEventArgs e){base.OnSessionEnding(e);Console.WriteLine("Session Ending");}//退出WPF时触发的事件protected override void OnExit(ExitEventArgs e){base.OnExit(e);Console.WriteLine("Exit Application");}}
Window 这个就不多说啥了
public class MainWindow : Window{public MainWindow(){this.Title = "MainWindow";}//获取鼠标在窗体内的点击事件protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e){base.OnMouseDown(e);//由于此窗体就是接受事件的窗体 所以这里用Thisstring message = string.Format("MouseDown on Point {0}", e.GetPosition(this));//输出控制台Console.WriteLine(message);MessageBox.Show(message, this.Title);}}
Application对象常用属性
1、MainWindow
获取当前Application中的主窗体,如果不进行修改,默认获取到的是第一个调用Show()的窗体对象
2、Windows
获取当前Application管理的所有窗体实例 集合类型
3、ShutdownModel
这是一个枚举类型,用以决定何时应该结束这个Application的声明周期,枚举值有三个
OnExplicitShutdown 只有在调用Application.Shutdown()方法时 才能结束生命周期
OnLastWindowClose 当Application所管理的所有窗体都关闭时 结束生命周期
OnMainWindowClose 当Application所管理的MainWindow关闭时 结束生命周期
4、Current (Static)
这是一个静态属性,直接通过Application.Current获取,这个属性获取了当前使用的Application实例
Window对象的常用属性
1、Owner
设置当前实例化的窗体隶属于哪个窗体,当设置此属性后,当前实例化窗体会受设置的窗体管理,具有相同的生命周期,并且会一直显示在设置的窗体前面
2、Owners
获取当前窗体所拥有的所有子窗体列表
3、ShowInTaskBar
这是一个bool类型,决定窗体是否会显示在Windows任务栏中
4、WindowStartupLocation
枚举类型,决定了窗体初始显示位置
5、WindowStyle
枚举类型,决定了窗体边框类型 默认为SingleBorderWindow 拥有一个最大化、最小化、关闭按钮
6、WindowState
枚举类型,决定了窗体在Show()之后的显示方式 默认为Normal 最大化 最小化 还是正常显示
本篇就讲到这里,下一篇会讲与WPF相关的一个很重要的概念 “设备无关像素/逻辑像素"
Tips:
说句心里话,每次写Blog都很揪心,很忐忑。生怕自己写错了什么,误导了别人,也给自己挖了坑。这篇文章里的东西不一定完全正确,因为毕竟我也算是一个初学者,如果有谁看到了其中的失误或者错误,请及时提醒我。曾经也做过WPF的项目,拖拽控件、查找源码,用过MVVM模式,也是一个CCCV CCAV党,虽然号称有半年的WPF开发经验,实际上真正从头系统了解WPF的时候,才发现了自己曾经一知半解的很多,误解的知识也很多。希望以后的日子里能跟大家共同进步,摆脱拖拽工人的模式……
WPF框架剖析,从头开始自己写WPF框架相关推荐
- PHP框架编写和应用知识点,写PHP框架需要具备那些知识?
原标题:写PHP框架需要具备那些知识? 后盾网 如果没用过框架,讨论各个框架的内容都没有可讨论性,想自己写个框架涉及到的内容很多,个人觉得自己写一个框架对自己的逻辑思维,开发架构以及这门语言都有质的提 ...
- WPF框架剖析(从头开始自己写WPF框架)
首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版.因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们学习. 创建一个WPF需要引用的 ...
- ssm框架里面前端拿HTML写,ssm框架引入Vue,声明式渲染,标签的href拼接字符串
一.引入Vue 在官网上下载vue.js.并用 1.下载Vue.js,地址:Vue.js下载地址 二.通过ajax获取后台参数,使用Vue渲染 调用后台control,获取到数据,传到前端,使用Vue ...
- DXUT框架剖析系列文章(原创:天行健 君子当自强而不息)
本文版权归博客园 lovedday 所有,转载请详细标明原创作者及原文出处,以示尊重! 原创作者: lovedday 原创博客:天行健 君子当自强而不息 原文出处:DXUT框架剖析 DXUT框架剖析 ...
- DXUT框架剖析(10)
本文版权归博客园 lovedday 所有,转载请详细标明原创作者及原文出处,以示尊重! 原创作者: lovedday 原文出处:DXUT框架剖析(10) 管理DXUT框架的函数 函数 描述 DXUT ...
- WPF老矣,尚能饭否——且说说WPF今生未来(中):策略
本文接上文<WPF老矣,尚能饭否--且说说WPF今生未来(上):担心>继续. "上篇"中部分精彩的点评: 虽然WPF不再更新了,但是基于WPF的技术还是在发展着,就比如 ...
- WPF 基础到企业应用系列2——WPF前世今生
1.开篇前言 很多时候了解一项新技术的历史和趋势往往比这项技术的本身价值还要重要.WPF作为一项新技术(已经三年多了,或者应该叫老技术了),我们都有必要了解它的来龙去脉,尤其是公司的CTO ...
- 基于WPF的桌面宠物开发(一) :WPF简介+环境搭建+简单界面
目录 一.WPF简介 1.什么是WPF? 二.WPF环境搭建 1.Visual Studio安装 2.安装 ".Net桌面开发" 工具包 3.新建WPF项目 4.导入WpfAnim ...
- WPF 基础到企业应用系列5——WPF千年轮回 续前缘
一,摘要 首先很高兴这个系列能得到大家的关注和支持,前端时间身体状况不适,所以暂停了更新,对此表示非常抱歉,以后会逐渐加快进度,不过由于这是一个很长的系列,我也想把它写好,所以以后也会慢慢来,在这个系 ...
- “WPF老矣,尚能饭否”—且说说WPF今生未来(上):担心
2019独角兽企业重金招聘Python工程师标准>>> 近日微软公布了最新的WPF路线图,一片热议:对于老牌控件提供商葡萄城来说,这是WPF系列控件一个重要的机遇,因此,Spread ...
最新文章
- 开发自己的山寨Android注解框架
- RHEL6 64位系统安装ORACLE 10g 64bit 数据库
- 在Windows下,用Hexo搭建博客
- 基于JAVA+Servlet+JSP+MYSQL的物流管理系统
- 工欲善其事必先利其器之搜索引擎
- Nginx Lua读取redis 进行权限认证操作
- malloc函数和free函数的使用方法解析
- aic准则和bic准则_如何编写敏捷的用户故事:7条准则
- Windows驱动程序之cat文件介绍
- 软件质量的定义及其六大特性(质量模型)
- java解压7z格式的压缩包
- 结构体与动态内存(5.11)
- 重定向和转发的区别+使用情景
- TEB轨迹优化算法-代码解析与参数建议
- 阿里云CentOS7下载地址
- Unity IK动画
- 投资 - 指标介绍:MA、WMA、EMA
- 项目需求之Android 监听键盘的弹起和隐藏setVisibility(View.GONE)方法失效
- labelmx条码打印软件3.7
- Why HTAP Matters