Emulate ShowDialog for Winforms UserControl
本文关键字:UserControl Winforms for ShowDialog Emulate | 更新日期: 2023-09-27 18:04:41
我想达到同样的效果,就像在这篇文章,但对于windows窗体,它甚至可能没有托管控件在不同的窗体?
编辑我更感兴趣的是实现本文中控件的确切行为,在表单上显示控件并阻塞调用函数,但不为此目的使用其他表单。
您可以使用两个按钮和消息的标签创建UserControl,然后在构造函数中将其可见性设置为false:
public MyDialog()
{
InitializeComponent();
Visible = false;
}
然后在控件中添加三个变量:
Form _parent;
bool _result;
bool _clicked = false;
父窗体将是包含控件的窗体,并且必须在使用控件之前设置,因为它必须知道必须禁用哪些。
public void SetParent(Form f)
{
_parent = f;
}
_result将包含对话框的结果,_clicked将用于确定何时关闭对话框。当你展示你的对话框时需要做的是:
- 设置标签
- 禁用表单(但不禁用对话框)
- 使对话框可见
- 等待用户点击其中一个按钮 隐藏对话框
- 重新启用父表单 返回结果
private void ParentEnabled(bool aBool)
{
if (_parent == null)
return;
foreach (Control c in _parent.Controls)
if (c != this)
c.Enabled = aBool;
}
并在ShowDialog方法中使用:
public bool ShowDialog(string msg)
{
if (_parent == null)
return false;
// set the label
msgLbl.Text = msg;
// disable the form
ParentEnabled(false);
// make the dialog visible
Visible = true;
// wait for the user to click a button
_clicked = false;
while (!_clicked)
{
Thread.Sleep(20);
Application.DoEvents();
}
// reenable the form
ParentEnabled(true);
// hide the dialog
Visible = false;
// return the result
return _result;
}
显然,按钮有责任设置_result和_clicked变量:
private void okBtn_Click(object sender, EventArgs e)
{
_result = true;
_clicked = true;
}
private void cancelBtn_Click(object sender, EventArgs e)
{
_result = false;
_clicked = true;
}
如何创建透明的形式,在中间包含文本的不透明形状(无论你喜欢)。然后在运行时,您将调整此窗体的大小,使其与您想要显示它的窗口大小相同,并放置它,以便它覆盖它。