我正在创建一个应用程序来安排不同的任务。这些通过在面板上绘制矩形来显示。这必须是响应式的。所以我需要在每次尺寸变化时绘制并使其无效。当我达到规划面板的最大高度时,它会自动滚动。
问题是当我抓住滚动条并开始滚动一点时,当我释放滚动条时,我的整个应用程序和计算机都会冻结。
这很可能是由于每次滚动和堆叠都会调用 onpaint 事件,导致应用程序挂起,直到它们全部完成。
现在我的问题是:我将如何解决这个问题?可能是通过防止绘制事件被多次调用,但是如何?
绘制事件调用的方法:
private void panelPlanning_Paint(object sender, PaintEventArgs e)
{
for (int i = 0; i < userList.Count; i++)
{
Label temp = new Label();
temp.Text = userList[i].Text;
temp.Width = panelUsers.Width;
temp.Height = 50;
temp.BorderStyle = BorderStyle.FixedSingle;
temp.Location = new Point(0, i * 50);
temp.TextAlign = ContentAlignment.MiddleCenter;
panelUsers.Controls.Add(temp);
foreach (FullTask task in taskList)
{
if (task.AssignedTo == userList[i].Text && task.StartDate != "" && task.DueDate != "")
{
DateTime start = DateTime.ParseExact(task.StartDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
DateTime end = DateTime.ParseExact(task.DueDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Brush brush;
if (task.Priority == Enums.priorities[2])
{
brush = Brushes.Yellow;
}
else if (task.Priority == Enums.priorities[1])
{
brush = new SolidBrush(Color.FromArgb(255, 0, 80, 123));
}
else
{
brush = Brushes.Red;
}
panelPlanning.CreateGraphics().FillRectangle(brush, new Rectangle((start.Subtract(dtPickerStart.Value).Days + 1) * labelDaysWidth, i * 50, (end.Subtract(start).Days + 1) * labelDaysWidth, 25));
}
}
}
}