C# Winform开发以及控件开发的需要注意的,被人问怕了,都是基础常识
我是搞控件开发的,经常被人问,所以把一些问题记录了下来!如果有人再问,直接把地址丢给他看。
一、 经常会有人抱怨Winform界面闪烁,下面有几个方法可以尽可能的避免出现闪烁
1.控件的使用尽量以纯色为主,尽量不使用背景图,或者把大图改成小图,或者图片不缩放绘制,或者直接用不透明的纯色背景色(Winform控件透明是伪透明,是通过截取父容器背景来实现的,所以效率比较低,而且有时候会有延迟。而且多个透明控件叠加的时候不能分层显示出各个控件的透明效果)
2.自定义控件中使用双缓冲。
3.窗体边框最好不要设置为None,保留窗体最大化最小化动画,可以避免最小化恢复时候的界面闪烁。可能会有人说我的窗体是自定义美化的,边框为None了。其实可以通过拦截消息重绘非客户区,实现边框不为None的时候重绘整个窗体的。 网上也有很多教程
二、自定义控件时候需要注意的
1.控件重绘的时候尽可能的处理e.ClipRectangle,减少不必要的绘图操作,标准重绘都应该在Paint事件里处理,用事件里的e.Graphics。
而不是在随便个地方就用CreateGraphics()来绘制,需要刷新的时候调用 Invalidate() 如果能计算重绘区域最好
2.使用双缓冲,在构造函数里加入这两行代码 减少闪烁
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
或者
DoubleBuffered = true;
3.如果你开发dll组件给别人用,记得项目属性里,生成,选择 XML文档文件,生成///<summary> 代码注释。到时候把dll给别人用的时候也把Xml带上,放到和dll同一个目录,这样别人开发的时候就有注释提示了
三、其他开发问题
1.多线程操作控件请使用控件的Invoke或者BeginInvoke调用
不要总想着其他线程中直接操作控件,会出现很多奇葩问题的。
Control.CheckForIllegalCrossThreadCalls 这个属性就是掩耳盗铃,就和 SetProcessWorkingSetSize(将内存强制压到虚拟内存里,给硬盘增加压力) 用来释放内存一样。当初不知道谁传出来的,误导一群人!
正常的多线程操作控件是
this.Invoke(new MethodInvoker(() => {
//UI操作代码
}));
或者用 async 语法 异步编程
不过还有人用很古老的写法,定义委托,判断 InvokeRequired在调用Invoke,虽然也可以,但是浪费时间。
还有 Application.DoEvents(); 也是个远古代码,能不用就不要用
使用线程的时候记得设置线程的 IsBackground=true; 程序关闭之后,线程能自动退出
2. 颜色System.Drawing.Color 这个结构体 是可以支持设置透明度的。可以3个或者4个值,Color.FromArgb(),4个值的时候是 Alpha,Red,Green,Blue. 第一个就是透明度的参数 0-255
3.如果你想把窗体最大化的时候全屏,遮住任务栏,请把窗体边框设置为None
4.控件布局的时候活用Dock和Anchor,这两个属性是互斥的
5.单行的TextBox的高度受字体影响,不能单独改。如果想美化边框效果,请把TextBox的边框隐藏了,放到Panel里,Panel在加个边框背景美化。
6.Label换行只要有\r\n就会换行的,如果要自动换行,先把AutoSize改成false,设置好宽度。字符超过宽度就会换行的。
7.System.Windows.Forms.Timer 这个是执行在主线程的,本质是控件消息循环里的一个定时消息,不要用来做耗时的操作。耗时操作请用 System.Threading.Timer和 System.Timers.Timer
8.Winform 对DPI支持的不完善,虽然.NET Framework 4.6 中有EnableWindowsFormsHighDpiAutoResizing。但是你必须所有控件用原生控件。
如果你用的不是.Net.4.6 而且使用了第三方控件,为了不影响布局,建议把里面的字体单位都改成像素,容器控件包括窗体的AutoScaleMode属性改成None。这样至少界面布局基本正常,高DPI里只是模糊了些
9.使用非托管资源最好显式调用Dispose释放资源,比如图片,文件读取等等。
this.BackgroundImage = global::WinFormsTest.Properties.Resources.bt;
Properties.Resources这个对象的图片属性,每次访问会创建一个图片副本,如果多个控件使用同一张图片,建议手动写代码设置,先设置到一个静态字段里,再引用这个图片字段。
10. try 不要乱用,能解决问题的能不加try的就不要加try,太多try容易导致异常不好定位。一般对于不确定是否异常的才需要加try,比如文件读取,网络连接等等,另外一种是一般开发底层框架的可以确定异常类型,可以配合throw new Exception,用来提示开发者调用出错的信息。另外异常可以全局捕获在 Application.Run加try和ThreadException事件记录日志。
之前看到有些人写一大堆try,程序运行靠try维持,简单的错误没有判断过滤掉,靠try来忽略。导致整个程序卡的一比!
四、一些VS快捷键
1.代码+Tab+tab VS代码快速生成补全,比如 if 再按两下Tab就可以生成if(){}。 mb + Tab+tab= MessageBox.Show("Test"); try、switch、事件绑定+=等等。很多代码都可以用这种方式快速生成。
2. F12 转定义,Ctrl+R+R 重命名, Ctrl + F 除了查找之外,还可以做正则表达式的简单验证,因为匹配结果可以染色。
其他问题自己先去百度吧!
最后问一下:Winform还有多少人用,很多人都转WPF了吧?另外.net的跨平台UI有没有意义?
C# Winform开发以及控件开发的需要注意的,被人问怕了,都是基础常识的更多相关文章
- CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建
Android开发使用控件入门--环境搭建 2014-12-24 09:57 14人阅读 评论(0) 收藏 编辑 删除 CAD控件.CAD三维控件,手机 ...
- Winform自定义键盘控件开发及使用
最近有学员提出项目中要使用键盘控件,系统自带的osk.exe不好用,于是就有了下面的内容: 首先是进行自定义键盘控件的开发,其实核心大家都知道,就是利用SendKeys.Send发送相应 的字符,但是 ...
- {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件
在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...
- WinForm控件开发总结目录
WinForm控件开发总结(一)------开篇 WinForm控件开发总结(二)------使用和调试自定义控件 WinForm控件开发总结(三)------认识WinForm控件常用的Attrib ...
- 浅谈Winform控件开发(一):使用GDI+美化基础窗口
写在前面: 本系列随笔将作为我对于winform控件开发的心得总结,方便对一些读者在GDI+.winform等技术方面进行一个入门级的讲解,抛砖引玉. 别问为什么不用WPF,为什么不用QT.问就是懒, ...
- 用C#开发ActiveX控件,并使用web调用
入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...
- C#开发ActiveX控件
昨天写了篇博客<Winform 程序嵌入WPF程序 并发送消息>,没有说明为什么要嵌入WPF程序,那么今天就来唠叨唠叨其中的一个使用场景,开发ActiveX控件 首先,新建一个类库工程Hu ...
- [转]使用C#开发ActiveX控件全攻略
前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如下: 先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network) ...
- ActiveX控件开发 C#
转自:http://hi.baidu.com/charlesx_kst/item/9c2f42e2920db3f42b09a4ff 前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如 ...
随机推荐
- Java中的==与equals
当使用==操作符判断类时,实际上判断的是二者是否指向同一个对象 若要判断两个对象是否含有相同的数据,需使用Object类中的equals方法 java中所有类都是从Object类中派生出来的
- 运维工具pssh和pdsh安装和使用
1. pssh安装与使用 1.1 pssh安装 [root@server]# wget http://peak.telecommunity.com/dist/ez_setup.py [root@ser ...
- [纪录片] 鸟瞰中国 ——China from Above
上周末我看了一部纪录片<鸟瞰中国>,觉得特别有意思,想要分享给你. 制作背景 <鸟瞰中国>是由中国五洲传播中心与美国国家地理频道联合拍摄的纪录片,由KNNY PNG.KLAUS ...
- Redis安装和实际应用
上次介绍了Redis的来龙去脉以及相关一些情况,点击回顾<深入浅出Redis>,接下来我们再讲讲Redis的安装和实际应用. 一.Redis的安装 下载安装包,redis-3.2.9.ta ...
- Python开发爆破工具
上一篇讲到了如何用Python开发字典,而当我们手里有了字典 就可以进一步去做爆破的任务了,可以用现成的工具,当然也可以自己写 接下来我就要一步一步来写爆破工具! 爆破MySQL: 想要爆破MySQL ...
- LabVIEW(八):程序结构中的循环结构
1.程序结构分为三种:循环结构.分支结构.顺序结构. 本文主要讨论循环结构. 2.While循环 左下角:循环计数端子i,从0开始计数,每进行一次循环,i自动增加1. 右下角:循环条件端子,当循环达到 ...
- 基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息
技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...
- 机器学习入门06 - 训练集和测试集 (Training and Test Sets)
原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 测试集是用于评估根据训练 ...
- LINUX capability概念及配置
写的不错的一片博客,可以参考熟悉相关概念,主要将了linux系统的系统调用,以及用法这里就不重新造轮子了 https://www.cnblogs.com/iamfy/archive/2012/09/2 ...
- Xamarin.Android 解决打开软键盘导致底部菜单上移问题
在界面布局中有EditText控件,该控件一旦获取焦点则打开软键盘,如果布局中有底部菜单,那么底部菜单可能会被软键盘顶在其上面,看如下效果: 解决方法:在活动绑定界面之前写上下段代码即可 Window ...