为Winforms UserControl模拟ShowDialog

时间:2011-08-08 08:00:25

标签: c# winforms user-controls showdialog

我想在this文章中获得相同的效果,但对于Windows窗体,是否可以在不将窗体托管在不同窗体上的情况下使用?

EDIT 我更感兴趣的是在文章中实现控件的确切行为,在窗体上显示控件并阻止调用函数,但不使用其他形式用于此目的。

2 个答案:

答案 0 :(得分:3)

您可以使用两个按钮和消息标签创建UserControl,然后在构造函数中将其可见性设置为false:

    public MyDialog()
    {
        InitializeComponent();
        Visible = false;
    }

然后向控件添加三个变量:

    Form _parent;
    bool _result;
    bool _clicked = false;

父表格将是您的控件所包含的表格,必须在使用控件之前设置,因为它必须知道必须禁用的内容。

    public void SetParent(Form f)
    {
        _parent = f;
    }

_result将包含对话框的结果,_clicked将用于确定何时关闭对话框。显示对话框时需要做的是:

  1. 设置标签
  2. 禁用表单(但不禁用对话框)
  3. 使对话框可见
  4. 等待用户点击其中一个按钮
  5. 隐藏对话框
  6. 重新启用父表单
  7. 返回结果
  8. 因此,您可以添加此方法以启用/禁用父窗体:

        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;
        }
    

答案 1 :(得分:0)

创建透明表单如何在中间包含不透明形状的文本(无论你喜欢什么)。然后在运行时,您可以调整此表单的大小,使其与要显示它的窗口大小相同,并将其放置以覆盖它。