c# - 绘画事件不断触发
问题描述
我一直致力于在 C# 中绘制网格,这很有效!但不知何故,我一直在使用 DrawGrid 方法遇到一些问题。我发现每次添加标签时都会重新绘制它,然后不断地重新绘制它。这是我的代码:
Rectangle[,] rec = new Rectangle[6,6];
Label label_1 = new Label();
Label label_2 = new Label();
public Reversi()
{
ClientSize = new Size(500,425);
BackColor = Color.DarkGreen;
NewGame();
Paint += DrawGrid;
}
public void NewGame()
{
// here is some more stuff which I will leave out for the sake of clarity
for (int i = 0; i < grspel; i++)
{
for (int j = 0; j < grspel; j++)
{
rec[i, j] = new Rectangle(50 + i * 50, 100 + j * 50, 50, 50);
}
}
DrawLabels();
}
public void DrawLabels()
{
label_1.Location = new Point(20, 50);
label_1.Text = "Zwart: " + zwart;
Controls.Add(label_1);
label_2.Location = new Point(330, 50);
label_2.Text = "Wit: " + wit;
Controls.Add(label_2);
}
public void DrawGrid(object o, PaintEventArgs pea)
{
MessageBox.Show("test");
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
pea.Graphics.DrawRectangle(new Pen(Brushes.Black), rec[i,j]);
}
}
}
为了可视化我的问题,我将其放在MessageBox.Show("test");
DrawGrid 方法的开头。我的其余代码(不在此处)使用此方法并且无法正常工作。我已经把问题缩小到了这个。
摆脱Controls.Add(label_i)
修复问题,但我需要标签。为什么会发生这种情况,更重要的是,我该如何解决?
解决方案
您添加了一个标签,因此会有一个 UI 更改并需要重新绘制的事件。它应该绘制添加的标签,对吗?恕我直言,这是预期的。
您不需要每次都将标签添加到控件列表中。只需添加一次(例如在 中Form.Load
)。
但是,更改标签的位置可能还需要重新绘制。它应该在新位置绘制标签,对吧?但是你的位置也是不变的。只需设置一次位置。
重绘是正常的,而且很好,因为它可以保持内容的更新。这不应该是一个问题。那么,你为什么不喜欢它?可能它会导致闪烁,而您不喜欢那样。
显示 MessageBox 也可能不是一个好主意。如果 MessageBox 在您的表单前面,则 MessageBox 后面的部分将需要再次绘制。
你可以
- 使用SuspendLayout()告诉绘制者不值得立即对更改做出反应,而是等到您完成所有与布局相关的更改。使用ResumeLayout()告诉画家现在该画画了。
- 查看双缓冲选项
但我需要标签
其实你没有。您可以使用Graphics.DrawString()而不是使用标签。