Winform FlowLayoutPanel 闪烁

  • 闪烁的原因

因为在后台代码中,对FlowLayoutPanel子控件的Visible属性进行循环设置,导致FlowLayoutPanel闪烁

  • 解决方案
  1. 引入Win Api
     
           [DllImport("user32")]
            private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
            private const int WM_SETREDRAW = 0xB;
  2. 在设置Visible前调用,禁止重绘FlowLayoutPanel
     
     //禁止pnl重绘  
    SendMessage(FlowLayoutPanel.Handle, WM_SETREDRAW, 0, IntPtr.Zero);

     

  3. 在设置完毕后,允许重绘FlowLayoutPanel
     
    //允许重绘pnl  
    SendMessage(FlowLayoutPanel.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
    FlowLayoutPanel.Refresh();


    完整代码如下:
     

            /// 
            /// 借阅类型的选择改变事件
            /// 
            /// 
            /// 
            private void LengType_CheckedChanged(object sender, EventArgs e)
            {
    
                /*
                 实现功能:在选择不同的借阅类型时,显示不同的录入信息
                 实现方式:1.每种借阅类型的Radiobutton的Tag赋值
                          2.在每个录入信息的Tag中保存输入那种的Tag,
                          Eg.如一录入框信息既是院外借阅(Tag为2),又是科研借阅(Tag为3),则此录入框的Tag为’2,3‘ ,以英文逗号分隔
                 
                 出现的问题:
                         频繁设置FlowLayoutPanel子控件的Visible属性,导致FlowlayoutPanel闪烁严重
                         解决方式:
                           调用WinApi  SendMessage 禁止FlowLayoutPanel 的重绘
                 
                         备注:网上什么设置双缓存,无用
                 */
                if (sender is RadioButton rb && rb.Checked)
                {
                    //禁止pnl重绘  
                    SendMessage(flApplyInfo.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
    
                    //获取申请录入信息下所有的录入控件
                    foreach (var control in flApplyInfo.Controls)
                    {
                        //信息录入框最外层都是 PanelBase进行包裹
                        if (control is PanelBase InfoInputPanel)
                        {
                            //当Tag为空或者Tag等于负一(-1)时,表示所有类别都有的输入框,无需操作
                            if (InfoInputPanel.Tag.IsNullOrEmpty() || InfoInputPanel.Tag.ToString() == SystemConst.ConstDel)
                            {
                                continue;
                            }
    
                            //将tag进行分隔
                            string[] panellengTypes = InfoInputPanel.Tag.ToString().Split(',');
    
                            //判断tag中是否属于此借阅类型
                            InfoInputPanel.Visible = panellengTypes.Contains(rb.Tag.ToString());
                        }
    
                    }
    
    
                    //允许重绘pnl  
                    SendMessage(flApplyInfo.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
                    flApplyInfo.Refresh();
                }
    
            }

     

你可能感兴趣的:(winform相关探索)