出席マーキングの目的でTableLayoutPanelを使用しています。このTableLayoutPanel内にコントロール(パネルとラベル)を追加し、それらのイベントを作成しました。いくつかの条件では、すべてのコントロールをクリアし、TableLayoutPanelの異なる位置に同じコントロールをバインドしました。コントロールを再バインドしている間、TableLayoutPanelがちらつき、初期化が遅すぎます。
7 に答える
すべてのコントロールを追加するまで、レイアウトを一時停止します。
TableLayoutPanel panel = new TabelLayoutPanel();
panel.SuspendLayout();
// add controls
panel.ResumeLayout();
ダブルバッファリングの使用も検討してください。TableLayoutPanelのサブクラスを作成する必要があります。こちらの例をご覧ください。
これは私にとってはうまくいきましたWindowsフォームのTableLayoutPanel&Panelによるちらつきを削除します
ここにそのリンクの内容があります(逐語的にコピーされます)
WindowsフォームのTableLayoutPanelとPanelによるちらつきを完全に削除するには、次のようにします。=-1. Form=trueのdoublebufferedプロパティを設定します。2.form.csに次の2つの関数を貼り付けます
#region .. Double Buffered function .. public static void SetDoubleBuffered(System.Windows.Forms.Control c) { if (System.Windows.Forms.SystemInformation.TerminalServerSession) return; System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); aProp.SetValue(c, true, null); } #endregion #region .. code for Flucuring .. protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } #endregion
- 、、、およびすべてのコンテナコントロールを
SetDoubleBuffered(“TableLaoutPannel_controlName”)
呼び出します。TableLayoutPannel
Pannel
Splitcontainer
Datagridview
RhishikeshLatheに感謝します投稿日:2014年2月16日20:11 pm
VB.net:
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H2000000
Return cp
End Get
End Property
C#:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x2000000;
return cp;
}
}
VBで、影響を受けるクラスの一番下に追加すると、確実に機能します。
C#では、他のプロパティと一緒にプロパティをクラスの一番上に追加します。
基本的に、Winformの完全なレンダリングを待機し、画面にペイントされているフォームのちらつきを取り除きます。テストしたことがない場合は、無視しないでください。私はwinformの待ち時間に大きな問題を抱えていましたが、これで修正されました。
このパネルを使用して、プロパティdBufferをtrueに設定します
public partial class MyTableLayoutPanel : TableLayoutPanel
{
public MyTableLayoutPanel()
{
InitializeComponent();
}
public MyTableLayoutPanel(IContainer container)
{
container.Add(this);
InitializeComponent();
}
/// <summary>
/// Double buffer
/// </summary>
[Description("Double buffer")]
[DefaultValue(true)]
public bool dBuffer
{
get { return this.DoubleBuffered; }
set { this.DoubleBuffered = value; }
}
}
UIのかなりの部分が背景色に透明度を使用していたため、最終的に使用した別の方法があります。これにより、WINFORMSのパフォーマンスが大幅に低下することを理解しています。ただし、これはWPFアプリケーション(通常はちらつきとして表示されない)には当てはまらないため、変換は有益である可能性があります。
//Call this function on form load.
SetDoubleBuffered(tableLayoutPanel1);
public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
return;
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
//テーブルレイアウトパネルのダブルバッファソリューションで完全に機能し、ちらつきは発生しません
上記の改善として、私はより良い結果を得ました:
TableLayoutPanel panel = new TabelLayoutPanel();
panel.SuspendLayout();
panel.StopPaint();
// add controls
panel.ResumePaint();
panel.ResumeLayout();