首页 > 解决方案 > 绘画事件不断触发

问题描述

我一直致力于在 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)修复问题,但我需要标签。为什么会发生这种情况,更重要的是,我该如何解决?

标签: c#paintevent

解决方案


您添加了一个标签,因此会有一个 UI 更改并需要重新绘制的事件。它应该绘制添加的标签,对吗?恕我直言,这是预期的。

您不需要每次都将标签添加到控件列表中。只需添加一次(例如在 中Form.Load)。

但是,更改标签的位置可能还需要重新绘制。它应该在新位置绘制标签,对吧?但是你的位置也是不变的。只需设置一次位置。

重绘是正常的,而且很好,因为它可以保持内容的更新。这不应该是一个问题。那么,你为什么不喜欢它?可能它会导致闪烁,而您不喜欢那样。

显示 MessageBox 也可能不是一个好主意。如果 MessageBox 在您的表单前面,则 MessageBox 后面的部分将需要再次绘制。

你可以

但我需要标签

其实你没有。您可以使用Graphics.DrawString()而不是使用标签。


推荐阅读