winformslabelflickering我有一个问题,Label控件非常闪烁。下面是一些重现问题的代码。如何解决这个问题?更新:前一种情况(表单直接包含标签)的解决方案是使form.DoubleBuffered=true。但这不是通用的解决方案。例如,对于SplitContainer中的标签,我应该怎么做?这是我的真实情况。更新的代码:DoubleBufferedLabel.cs:usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Windows.Forms;namespaceFlickerLabelTest{publicclassDoubleBufferedLabel:Label{publicDoubleBufferedLabel(){DoubleBuffered=true;}}}DoubleBufferedSplitContainer.cs:使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Windows.Forms;namespaceFlickerLabelTest{publicclassDoubleBufferedSplitContainer:SplitContainer{publicDoubleBufferedSplitContainer(){DoubleBuffered=true;}}}Form1.cs中:usingSystem;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Windows.Forms;namespaceFlickerLabelTest{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidtimer1_Tick(objectsender,EventArgse){label1.Text+=“0”;}}}Form1.Designer.cs:namespaceFlickerLabelTest{partialclassForm1{//////必需的设计器变量。///privateSystem.ComponentModel.IContainercomponents=null;//////清理所有正在使用的资源。//////如果托管资源应该被释放则为真;否则,假的。protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){components.Dispose();}base.Dispose(处理);}#regionWindows窗体设计器生成的代码//////设计器支持所需的方法-不要使用代码编辑器修改///此方法的内容。///privatevoidInitializeComponent(){this.components=newSystem.ComponentModel.Container();this.timer1=newSystem.Windows.Forms.Timer(this.components);this.label1=newFlickerLabelTest.DoubleBufferedLabel();this.splitContainer1=newDoubleBufferedSplitContainer();this.splitContainer1.Panel2.SuspendLayout();这个.splitContainer1.SuspendLayout();这个.SuspendLayout();////timer1//this.timer1.Enabled=true;这个.timer1.Interval=1;this.timer1.Tick+=newSystem.EventHandler(this.timer1_Tick);////label1//this.label1.Dock=System.Windows.Forms.DockStyle.Fill;this.label1.Location=newSystem.Drawing.Point(0,0);this.label1.Name="label1";this.label1.Size=newSystem.Drawing.Size(186,262);this.label1.TabIndex=0;this.label1.Text="label1";////splitContainer1//this.splitContainer1.Dock=System.Windows.Forms.DockStyle.Fill;this.splitContainer1.Location=newSystem.Drawing.Point(0,0);this.splitContainer1.Name="splitContainer1";////splitContainer1.Panel2//this.splitContainer1.Panel2.Controls.Add(this.label1);this.splitContainer1.Size=newSystem.Drawing.Size(284,262);this.splitContainer1.SplitterDistance=94;this.splitContainer1.TabIndex=1;////Form1//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,13F);这个.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(284,262);this.Controls.Add(this.splitContainer1);this.DoubleBuffered=true;this.Name="Form1";this.Text="Form1";this.WindowState=System.Windows.Forms.FormWindowState.Maximized;this.splitContainer1.Panel2.ResumeLayout(false);this.splitContainer1.ResumeLayout(false);这个.ResumeLayout(false);}#endregionprivateSystem.Windows.Forms.Timertimer1;私有DoubleBufferedLabel标签1;私有DoubleBufferedSplitContainersplitContainer1;}}Program.cs中:使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Windows.Forms;namespaceFlickerLabelTest{staticclassProgram{//////应用程序的主要入口点。///[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);应用程序运行(新Form1());}}}问题在对接如果您将Label.Dock从Fill更改为None,手动调整标签大小以填充拆分面板,然后将其锚定在所有面上,它不会闪烁。如果要查看闪烁的原因,同时Dock仍设置为Fill,请重写DoubleBufferedLabel类中的OnResize,启动应用程序,并在运行时在OnResize处设置断点。为Size添加一个watch,您会看到它在设计时和运行时大小之间切换。我尝试在您的示例中使用常规的SplitContainer和Label,并将DoubleBuffer的形式设置为False,如果我在Label上将Dock设置为None,它不会闪烁。将此粘贴到您的表单代码中以帮助计算Dock布局:base.OnLoad(e);不是真正的答案,但你为什么要每毫秒更新一次标签?如果您的意思是1秒,则必须将间隔设置为1000。您可以通过给表单时间重绘自身并使用更大的间隔来解决此问题。更新:事实证明,将DoubleBuffered设置为true就可以了。感谢csharptest.net指出这一点,感谢DxCK纠正我。我想你正在寻找这个:http://msdn.microsoft.com/en-us/library/3t7htc9c.aspx示例:classForm1:Form{publicForm1(){this.DoubleBuffered=true;}}停止定时器设置为1ms。不认真,你在这里看到的是标签试图跟上它的变化,但没有像他们经常做的那样。可能的解决方案是:为什么不通过异步委托来运行标签更新功能?或者使用System.Threading命名空间以获得不同的风格。另外,正如我之前提到的,如果将窗体上的DoubleBuffer属性设置为true将会很有用(尽管这不是灵丹妙药)。在窗体上激活双缓冲将解决问题。但这实际上是一个昂贵的解决方案。如果您只是将以下内容添加到表单中:SetStyle(ControlStyles.AllPaintingInWmPaint,true);闪烁也将结束。Windows操作系统的默认行为是首先让所有窗口绘制背景,然后让它们进行实际绘制。这是过去的事了,那时画字母其实要花不少时间。这个标志告诉它一次折叠背景油漆和普通油漆(对于同一个窗口)。真正的双缓冲可以保留给您实际绘制自己的情况(当您覆盖OnPaint时)。以上就是C#学习教程分享的全部内容:winformslabelblinking。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
