# WPF 软件开发心得

wpf 是C#开发的一个框架是，是一套基于[XML](https://zh.wikipedia.org/wiki/XML)、[.NET Framework](https://zh.wikipedia.org/wiki/.NET_Framework)、[向量](https://zh.wikipedia.org/wiki/向量)绘图技术的展示层开发框架。

## 初次接触

我最开始是写python的，就会个爬虫，然后莫名奇妙的就开始做C#了，开发WPF。

最开始用了一个月熟悉C# ，然后用了一个月写了一个WPF 的Demo ,然后就是根据原有的项目代码进行重构。

现在回想起来那段时间写的东西真的是不好看，也不实用，就是最基本的按钮点击跳转 ，绑定个数据之类的。

## 重构阶段

大概过了7个月的样子，我的第一份作品用在了现场实施上面，软件可以正常运行，这个时候我开始在优化代码结构，合并同类项目，然后优化项目结构，当时的时间还是满充分的，花了2个月，代码改了两版，大概把一份项目的工作周期从一个月优化到1周。 

这个时期还是显得很稚嫩，完全不像是一个程序员，还是没有项目的意识，没有一个良好的代码体系。

然后又花了二个月，开始把代码按照工程项目的开发方式重构3.0 ,该封装的封装。该独立出来的独立出来，整了一个项目工作的雏形出来。在日常工作之余。

此后就不算是新手了，算是初级程序员，也有新人要带一带。恰好碰到了一个新项目。直接在原有的基础上重开了一个新的，依据项目雏形重绘的代码。

代码要比原有的代码更精简，许多不必要的部分都剔除了，然后反过来改原来的代码。

不过此阶段的代码功底还是偏弱，萌芽阶段。

这个项目持续的周期很长，东西不难，天天出差，出去就继续优化这个结构，把简单开发周期从5天优化到3天。

此阶段完成的事情就是在WPF 框架的基础上，封装出来一个常见的工程文件，并定义相关基础类。就相当于是一个Java 的实际项目框架，python 的Scrapy 。许多东西的模板都做好了，只需要复制粘贴在对映的位置就可以了，很简单的一个特例化工程开发。

同时拆分原来合并在一起的项目。期间也参考了成熟的项目架构，定制化了 Base,Comom,Util,等一些乱七八糟的东西 。

这个阶段最重要的就是工程的思想，做的东西，不仅仅是要自己能够开发，还要能分出去，双方同时开发，或者离职了交付给他人的时候也能看得懂。

## 融汇阶段

最近处在的阶段就是融汇阶段，算是在从初级开法迈向中级开发，开始去考虑性能的问题，如何写出来高质量的代码，如何去封装代码结构。会去考虑硬件和其他软件的调用。

软件开发，框架最先，除了软件框架，还有布局框架。

一个完整的软件界面，有任务栏，菜单栏，侧边栏，状态栏，主窗口，其中这些里面，除了主窗口，其他的都可以缩小，甚至忽略。

我之前做的特例化开发就是只有主窗口和状态栏，写的就是很简单。

这其中的每一个部分的开发逻辑，都不是很简单，都可以做到很复杂。

比如任务栏的自绘，同时保证具有高性能。现在的市面上的软件已经基本没有多少上面的界面是windows 原生的了，原生的丑，最关键的是，原生的状态栏会让整体的界面变得臃肿，每多一个固定的状态栏的位置，主界面就少一点空间。因为除了必要展示信息，其他的软件界面，都需要为软件本体保留。

比如菜单栏的状态绑定和全局命令

 自带的菜单栏的颜色也不是很好看，重绘的话要如何调节其中的每一个参数的信息？

我在做这个的重绘的时候，接触到了wpf 软件开发最重要的核心不见，xml 原生框架，vs 根据这个原生的框架信息，参考自己写的命令参数，渲染出来具体的画面。根据他的写法，就可以手动重绘任何一个自己需要的部件。

比如侧边栏的工具属性、

侧边栏是很多的软件已经淘汰掉的功能，但是比如360、edge 就保留这个元素，现在侧边栏的很多的元素信息已经被玩出来了花，比如微信的写法等等，侧边直接做成按钮，可以点击跳转到一些界面

比如状态栏的自动现实

状态栏本来应该是独立的组件，只需要显示需要现实的信息即可，但是如何把这个模块写的有新意呢？

像是chrome 已经不在主动显示许多元素，把最主要的空间留给使用者，但是同时也保留了这些界面属性，可以需要的时候显示出来。

像是vs中，把底部状态栏，同时添加上菜单的熟悉，可以在底部进行控制，而不是仅仅是展示信息。

播放器的调用与销毁

各种功能按钮，打印等

设置等等

软件开发，对接的部分只占据软件开发的一小部分，一个完善的框架应该可以对接任何一种接口。就是MVVM 开发的理念，分离开发，接口是接口的部分，控制是控制的部分，展示是展示的部分。

展示不仅仅是为了某一个特例化软件做的特例化开发。

软件的基础框架是可以进行复用的。但是高级功能不行，对于高级功能而言，其开发流程往往是一个大型团队对其进行维护和更新。比如Google 浏览器，比如阿里云。微信只是一个小团队，但是围绕微信做的一系列的软件硬件的开发，就是一个庞大的团队。

比如微信登录，微信公众号，微信小程序。微信现在是一个框架，再接入更小型的团队，自身本身并不是一个庞大的怪物。

我把这些都考虑完全之后，我应该就是一个完整的中级程序员了。



## 展望

高级

高级程序员需要的能力从我的角度来看，就是写任何的语言都是一种工具，为了实现结果的工具，可能会很多的语言，也可能不会，但是一法通百法通。

能够解决一些和逻辑没有关系的问题，比如用户环境和自身开发环境不一致导致的不能使用。比如系统引起的内存泄漏，软件崩溃。比如硬件所造成的软件BUG。

或者是在某一个领域只手遮天。

顶级。

感觉语言不好用，自己会开发一套，感觉底层写的不好，自己重写一遍。

我现在做的一部分的工作是架构的，但是不全是，架构需要考虑的就不是一个语言，架构提出的是一个解决方案，可能是多个语言协同开发，同时包含硬件的部分。我需要做的只是一个语言下，软件开发需要处理的部分。

初级干活就行，中级要思考，高级要解决。
