我有一个表单,上面有一些控件(btnCreateReport、pnlDarkLayer)。我有一个适合于该表单的面板(Dock = Fill),并且它位于所有控件的后面。当用户点击btnCreateReport按钮时,我调用pnlDarkLayer的BringToFront方法,并在一些计算之后调用按钮的SendToBack()方法。我想在表单控件上绘制一个暗层,并禁用表单上的所有控件。这可能吗?谢谢。
也许这段代码可以帮助您理解我的目的:
但我无法在我的表单中看到ProgressForm。
也许这段代码可以帮助您理解我的目的:
private void btnCreateReport_Click(object sender, EventArgs e)
{
pnlDarkLayer.BackColor = Color.FromArgb(100, Color.Gray);
pnlDarkLayer.BringToFront();
btnCreateReport.Enabled = false;
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
pnlDarkLayer.SendToBack();
btnCreateReport.Enabled = true;
}
这段代码可以隐藏所有控件,但我不想在表单上隐藏它们。我想在它们上面绘制一个暗色层。用户必须能够看到控件。
我需要像对于表单的透明度属性一样对其控件进行设置。
我尝试了以下代码:
pnlDarkLayer.CreateGraphics().CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceOver;
更新:我尝试了以下代码(使用表单而非面板):
private void btnCreateReport_Click(object sender, EventArgs e)
{
btnCreateReport.Enabled = false;
frmProgress ProgressForm = new frmProgress();
ProgressForm.TopLevel = false;
ProgressForm.Parent = this;
ProgressForm.BringToFront();
this.Controls.Add(ProgressForm);
ProgressForm.Show();
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
ProgressForm.Close();
btnCreateReport.Enabled = true;
}
但我无法在我的表单中看到ProgressForm。
DoEvents
的循环。要么为ProcessingReport
提供某种钩子以在完成时调用一些代码,要么仅将最后一部分代码放在ProcessingReport
方法的末尾,并记得使用BeginInvoke
确保它在UI线程上执行。在几乎所有情况下,应避免使用Application.DoEvents
。 - Jon Skeet