记录|Form1中嵌套Form2时的频闪问题解决[不同于常见的三部曲]

目录


前言

参考文章:
C#画图解决闪烁问题

解决winform中重绘时控件闪烁的问题(panel1.GetType().GetProperty("DoubleBuffered",System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(panel1, true, null)😉

参考视频:
C# WinForm 制作一个渐变背景Panel

没想到进行自动化页面布局后,Form之间的嵌套会出现频闪问题。

尝试了常见的设置双缓冲方法,给组件,给Form都试过,结果都无法解决闪屏的问题。

后来直接采用视频中的自己创建组件的方式解决了问题。


一、常见的解决方案

  • 就是开启组件的双缓冲方法
csharp 复制代码
panel1.GetType().GetProperty("DoubleBuffered",System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(panel1, true, null);

或者

csharp 复制代码
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |ControlStyles.AllPaintingInWmPaint, true);

二、自己创建渐变色组件GradientPanel

  • 就是创建个.cs类,只是里面的写法没见过,哈哈哈,现在长知识了。这边将完整代码放到下面:
csharp 复制代码
/*
 * 功 能:     渐变色Panel
 * 创建时间:  2024/8/27 21:18:19
 * 创建人:     小白鼠零号
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ZHCH_winform_2.manager
{
    public class GradientPanel : Panel
    {
        private Color exColor1 = Color.Lime;
        [Category("EX属性")]
        [DefaultValue(typeof(Color), "Lime")]
        public Color EXColor1
        {
            get { return exColor1; }
            set { exColor1 = value; Invalidate(); }
        }

        private Color exColor2 = Color.Blue;
        [Category("EX属性")]
        [DefaultValue(typeof(Color), "Blue")]
        public Color EXColor2
        {
            get { return exColor2; }
            set { exColor2 = value; Invalidate(); }
        }

        private float exAngle = 45f;
        [Category("EX属性")]
        [DefaultValue(typeof(float), "45")]
        public float EXAngle
        {
            get { return exAngle; }
            set { exAngle = value; Invalidate(); }
        }
        public GradientPanel()
        {
            //DoubleBuffered = true;
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, exColor1, exColor2, exAngle);
            e.Graphics.FillRectangle(brush, ClientRectangle);
        }

    }
}

三、最终效果展示


更新时间

  • 2024.08.27:创建
  • 2024.08.28:找到正确的解决方案。
相关推荐
郝学胜_神的一滴8 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
水饺编程11 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
XiaoZhenHua9811 小时前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng66113 小时前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d
郝学胜_神的一滴14 小时前
C++11 工程级应用 11:编译期黑魔法,告别重复烂代码
c++·visual studio
淡海水14 小时前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
XiaoZhenHua9815 小时前
C# WinForms + 西门子S7 + SQLite + EPPlus生产数据采集系统架构设计
系统架构·sqlite·c#
Lost of 程序猿16 小时前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net
VIP_CQCRE16 小时前
Visual Studio 也能接入 AI 编程:用 Ace Data Cloud 快速配置 LMLocal
openai·ai编程·visual studio·ace data cloud
an86950011 天前
unity如何在visual studio中打断点debug
unity·游戏引擎·visual studio