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

15 篇文章 0 订阅
12 篇文章 1 订阅


前言

参考文章:
C#画图解决闪烁问题
[解决winform中重绘时控件闪烁的问题](panel1.GetType().GetProperty(“DoubleBuffered”,System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(panel1, true, null)😉
参考视频:
C# WinForm 制作一个渐变背景Panel

没想到进行自动化页面布局后,Form之间的嵌套会出现频闪问题。
在这里插入图片描述

尝试了常见的设置双缓冲方法,给组件,给Form都试过,结果都无法解决闪屏的问题。
后来直接采用视频中的自己创建组件的方式解决了问题。


一、常见的解决方案

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

或者

this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |ControlStyles.AllPaintingInWmPaint, true);

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

  • 就是创建个.cs类,只是里面的写法没见过,哈哈哈,现在长知识了。这边将完整代码放到下面:
/*
 * 功 能:     渐变色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:找到正确的解决方案。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在el-form嵌套el-form提交数据,你可以使用以下方法操作: 1. 首先,为了在el-form嵌套el-form,你需要在外层form表单使用ref属性来标识它。 2. 在内层的el-form,你可以使用prop属性来绑定对应的数据字段。 3. 在提交数据,你可以在外层form表单的提交方法,通过调用内层form表单的validate方法来校验内层form表单的数据。 4. 在校验通过后,你可以继续执行你的其他操作,比如调用接口等一系列正常操作。 下面是一个示例代码,展示了如何在el-form嵌套el-form提交数据的操作: ```javascript <template> <el-form ref="outerForm" :model="formData" :rules="formRules" @submit="submitForm"> <!-- 外层form表单的内容 --> <el-form-item label="外层字段"> <el-input v-model="formData.outerField"></el-input> </el-form-item> <!-- 内层form表单 --> <el-form ref="innerForm" :model="formData.innerData" :rules="innerFormRules"> <!-- 内层form表单的内容 --> <el-form-item label="内层字段"> <el-input v-model="formData.innerData.innerField"></el-input> </el-form-item> <!-- 其他内层表单字段... --> </el-form> <!-- 提交按钮 --> <el-button type="primary" native-type="submit">提交</el-button> </el-form> </template> <script> export default { data() { return { formData: { outerField: '', innerData: { innerField: '' } }, formRules: { outerField: [ { required: true, message: '请输入外层字段', trigger: 'blur' } ] }, innerFormRules: { innerField: [ { required: true, message: '请输入内层字段', trigger: 'blur' } ] } }; }, methods: { submitForm() { // 校验内层form表单的数据 this.$refs.innerForm.validate().then(() => { // 内层form表单校验通过后执行的操作 // 可以在这里调用接口等一系列正常操作 // 内层form表单数据校验通过后,再提交外层form表单的数据 this.$refs.outerForm.validate().then(() => { // 外层form表单校验通过后执行的操作 // 可以在这里继续执行你的其他操作,比如调用接口等一系列正常操作 }); }); } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值