usercontrol在设计时以编程方式添加另一个用户控件

时间:2011-04-28 15:45:14

标签: winforms user-controls windows-forms-designer

我有一个usercontrol(UC1),它根据用户想要显示的内容在设计时改变方面。

  • 使用usercontrol UC2弹出窗口的常规按钮(窗口仅在运行时显示)
  • UC2直接托管在UC1中(常规按钮未显示)

由于我想在两种情况下使用相同的UC2实例,我只是在UC1和表单之间转移所有权。

public UC1 ()
{
    _uc2 = new UC2 ();
}

public bool DisplayModeSimple
{
    get { return _displayModeSimple; }
    set
    {
        _displayModeSimple = value;
        if (_displayModeSimple)
        {
            // ... Verify if _uc2 is already in Controls...
            Controls.Remove (_uc2);
            uiButton.Visible = true;
        }
        else
        {
            // ... Verify that _uc2 is not in Controls ...
            Controls.Add (_uc2);
            uiButton.Visible = false;
        }
    }
}

private void HandleButtonClick (object sender, EventArgs e)
{
    // Not called if DisplayModeSimple=false since button is hidden...
    using (var form = new PopupForm (_uc2))
    {
        form.ShowDialog (this);
    }
}

在设计和运行时模式下都能正常工作。

在设计模式下,如果我改变显示模式,UC1的行为正确。

但是,可以单击UC2上的控件,就像它是运行时一样。 如果我然后关闭托管UC1的表单并重新打开它,一切都恢复正常,即我无法“点击”UC2中的任何控件。

1 个答案:

答案 0 :(得分:0)

问题是您的第一个UserControl托管在VS上,因此它知道处于设计模式。第二个UserControl托管在第一个UserControl中,因此它的主机不是Designer,它认为是在一个普通的容器中并且相应地运行。如何解决这个问题有点棘手,因为没有简单的解决方案AFAIK。 Here你可以找到一些解决方法。另一个可能是递归地测试Site.DesignMode,但它取决于控件的深度级别。