gpt4 book ai didi

c# - 为什么面板在移除它及其子面板时会闪烁?

转载 作者:行者123 更新时间:2023-12-03 21:17:23 25 4
gpt4 key购买 nike

我有一个带有自定义控件的表单,UserControls。其中一个控件与其他控件组成:TableLayoutPanelPictureBox(它位于另一个 UserControl 内部)、Label >。从视觉上看,它们的描述方式如下:

Visual description

如图所示,红色矩形是UserControl,橙色矩形是TableLayoutPanel,黄色和绿色椅子是其他UserControl 控件由 PictureBoxLabel 组成。

椅子(黄色和绿色的)是动态绘制的。例如绘制黄色椅子:

    private void DibujarSillasEconomicas()
{
Silla[] cheapChairs = m_avion.GetCheapChairs();
Silla silla;
byte fila_silla = 0;
byte col_silla = 0;
ControlVisualChair ctlSillaGrafica;

for(int num_silla = 0; num_silla < cheapChairs.Length; ++num_silla)
{
silla = cheapChairs[num_silla];
ctlSillaGrafica = new ControlSillaGrafica(silla);
ctlSillaGrafica.Dock = DockStyle.Fill;
ctlSillaGrafica.BackColor = Color.Black;

if (num_silla > 0 & num_silla % 6 == 0)
{
++fila_silla;
col_silla = 0;
}

tplSillasEconomicas.Controls.Add(ctlSillaGrafica, col_silla == 3? ++col_silla : col_silla, fila_silla);

++col_silla;
}
}

这些椅子和黄色的椅子绘制正确。当我要登记乘客时出现问题:

Adding a passenger

请注意,当我添加乘客时,控件会闪烁。在代码中,当我完成添加乘客时我会执行以下操作:

this.Controls.Remove(ctlAvion); // Removes the actual UserControl (red rectangle)
ctlAvion = new ControlAvion(m_avion); // Creates a new one
ctlAvion.Location = new Point(2, 13);
ctlAvion.Size = new Size(597, 475);
this.Controls.Add(ctlAvion); // Adds the new UserControl to the main controls (a Form).

如何避免这种闪烁效果?

我尝试了以下 UserControls 方法:

ctlAvion.Invalidate();
ctlAvion.Update();
ctlAvion.Refresh();

但是它们不起作用!

预先感谢您的帮助!

编辑:

@Idle_Mind 给出的答案是针对我的问题的,它通过重新绘制/绘制我设计的自定义控件解决了我的问题。

最佳答案

在对面板控件进行任何修改之前以及之后调用 ResumeLayout() 时,请尝试使用 SuspendLayout()

还使您的控件双缓冲,例如对于面板定义此类并使用它而不是面板

public class PanelEx : Panel
{
public PanelEx()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
}
}

关于c# - 为什么面板在移除它及其子面板时会闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com