效果
遮罩层对话框:
异步加载效果:
原理
在主窗口上先弹出一个和主窗口大小相同、位置重叠的半透明模式窗口(蒙版层),紧接着在这个半透明窗口上方中间位置,弹出一个没有边框、不可移动和控制大小的模式窗口。将最上方窗口的DialogResult属性,通过中间的半透明窗口,传递到主窗口。
设计
主窗口
private void btn_showdialog_Click(object sender, EventArgs e)
{
label1.Text ="the dialog return "+ (MaskDialog.ShowDialog(this, new FormDialog()) == DialogResult.OK ? "ok" : "cancel");
}
private void btn_load_Click(object sender, EventArgs e)
{
FormLoading frm = new FormLoading(() =>
{
System.Threading.Thread.Sleep(3000);
return "ok!";
});
MaskDialog.ShowDialog(this, frm);
label1.Text = frm.Result.ToString() ;
}
对话框
private void btn_ok_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
}
private void btn_cancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
遮罩层
在代码中生成实现。
主要实现类
public class MaskDialog
{
public static DialogResult ShowDialog(Form layOnForm, Form dialogForm)
{
dialogForm.ShowInTaskbar = false;
dialogForm.ControlBox = false;
dialogForm.FormBorderStyle = FormBorderStyle.None;
dialogForm.StartPosition = FormStartPosition.CenterParent;
using (Form frm = createMask(layOnForm))
{
frm.Shown += (sender, e) =>
{
using (dialogForm)
{
frm.DialogResult = dialogForm.ShowDialog(frm);
}
};
return frm.ShowDialog(layOnForm);
}
}
private static Form createMask(Form layOnForm)
{
Form frmMask = new Form();
frmMask.Height = layOnForm.Height;
frmMask.Width = layOnForm.Width;
frmMask.Opacity = 0.7;
frmMask.ShowInTaskbar = false;
frmMask.ControlBox = false;
frmMask.FormBorderStyle = FormBorderStyle.None;
frmMask.StartPosition = FormStartPosition.CenterParent;
return frmMask;
}
}