zoukankan      html  css  js  c++  java
  • 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.控件布局的时候活用DockAnchor,这两个属性是互斥的

    5.单行的TextBox的高度受字体影响,不能单独改。如果想美化边框效果,请把TextBox的边框隐藏了,放到Panel里,Panel在加个边框背景美化。

    6.Label换行只要有 就会换行的,如果要自动换行,先把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有没有意义?

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/dskin/p/4783574.html
Copyright © 2011-2022 走看看