winform 控件开发
避免出现闪烁
1.控件的使用尽量以纯色为主,尽量不使用背景图,或者把大图改成小图,或者图片不缩放绘制,或者直接用不透明的纯色背景色(Winform控件透明是伪透明,是通过截取父容器背景来实现的,所以效率比较低,而且有时候会有延迟。而且多个透明控件叠加的时候不能分层显示出各个控件的透明效果)
2.自定义控件中使用双缓冲。
3.窗体边框最好不要设置为None,保留窗体最大化最小化动画,可以避免最小化恢复时候的界面闪烁。可能会有人说我的窗体是自定义美化的,边框为None了。其实可以通过拦截消息重绘非客户区,实现边框不为None的时候重绘整个窗体的。
自定义控件开发:
1、控件重绘的时候尽可能的处理e.ClipRectangle,减少不必要的绘图操作;
2、标准重绘都应该在Paint事件里处理,用事件里的e.Graphics。而不是在随便个地方就用CreateGraphics()来绘制
3、需要刷新的时候调用 Invalidate() 如果能计算重绘区域最好
减少闪烁:使用双缓冲,在构造函数里加入这两行代码
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
或者
DoubleBuffered = true;
项目属性里,生成,选择 XML文档文件,生成///<summary> 代码注释。
到时候把dll给别人用的时候也把Xml带上,放到和dll同一个目录,这样别人开发的时候就有注释提示了
多线程调用:
多线程操作控件请使用控件的Invoke或者BeginInvoke调用 ,使用线程的时候记得设置线程的 IsBackground=true; 程序关闭之后,线程能自动退出
this.Invoke(new MethodInvoker(() => { //UI操作代码 })); 或者用 async 语法 异步编程
透明度:
颜色System.Drawing.Color 这个结构体 是可以支持设置透明度的。可以3个或者4个值,Color.FromArgb(),4个值的时候是 Alpha,Red,Green,Blue. 第一个就是透明度的参数 0-255
Design属性:
ToolboxItem
有时候是控件的Designer部分没有写好,不想别人一引用DLL就出现控件 可以设置:
public class MyPanel : UserControl
这样用户控件就自动隐藏了,不出现在工具箱中。
ToolboxBitmap
让用户控件在工具箱中显示不同的图标:
public class MyPanel : UserControl
这样用户控件使用的图标是Panel的图标。
如果不用系统的图标,而使用自己的图标,可以这样
public class MyPanel : UserControl
不过,一定要注意路径,WindowsApplication1.Images.MyOKL.bmp表示,解决方案是WindowsApplication1,目录是Images,文件名是MyOKL.bmp,同时,这个图片必须是“Resources嵌入的资源
Category与Description
[Category("Appearance"), Description("阴影色")] public System.Drawing.Color ShadowColor { get { …} set { …} }
经常一起的属性,Category表示类型,如属性框中所显示的外观,布局等分类,当然,你可以自己的“自定义属性”,而Description就是这个属性的描述,用来说明属性有什么用途。这两个的设置相对都比较简单,可以说,一看就知道,不过提一下,Appearance是将出现在属性面板中,外观一栏。
DefaultValue
[DefaultValue(typeof(Color), "DarkGray")] public System.Drawing.Color ShadowColor { get { …} set { …} }
用于设置默认的值,对于string,bool,int,可以直接写出来:
这是可以的,不过,不是这三种类型的话,就比较麻烦,一定要先转化为string才能设置成功。如上面的DarkGray,这是系统定义的颜色,这还是比较好处理的。不过,如果是一些自定义的颜色,如颜色是128,0,128,你应该将128转为16进制,写成0x800080,前缀0x是一定要加的。最后就这样
Browsable
表示是否在属性面板中显示这个属性
表示,将在属性面板中显示这个属性。
DesignerSerializationVisibility
表示,是否在*.Designer.cs文件中将设置的代码写出来,也就是是否要实现序列化
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
表示需要实现序列化。
翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)译
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-03-07 WCF中常用的binding方式 z
2013-03-07 最大子段和