容器 UserControl - 处理和修改添加的控件

Container UserControl - Handle and Modify Added Controls

我正在尝试将自定义容器创建为 UserControl

我的目标:我希望能够在设计器中拖动控件并在我的用户控件代码中处理传入的控件。

示例: 我将我的容器放在某处,然后添加一个按钮。在这一刻,我想让我的用户控件自动调整这个按钮的宽度和位置。这就是我卡住的地方。

我的代码:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
public partial class ContactList : UserControl
{
    public ContactList()
    {
        InitializeComponent();
    }        

    private void ContactList_ControlAdded(object sender, ControlEventArgs e)
    {
        e.Control.Width = 200;   // Nothing happens
        e.Control.Height = 100;  // Nothing happens

        MessageBox.Show("Test"); // Firing when adding a control
    }
}

MessageBox 运行良好。集合 widthheight 被忽略。
问题只是 "why?".


编辑

我刚刚注意到,当放置按钮并使用 F6 重新编译时,按钮的大小被调整为 200x100。为什么这在放置时不起作用?

我的意思是... FlowLayoutPanel 会在您放置时立即处理添加的控件。这就是我正在寻找的确切行为。

使用 OnControlAdded

要修复您的代码,当您将控件放在容器上并且您想要在 OnControlAdded you should set properties using BeginInvoke, this way the size of control will change but the size handles don't update. Then to update the designer, you should notify the designer about changing size of the control, using IComponentChangeService.OnComponentChanged 中设置一些属性时。

以下代码仅在您将控件添加到容器时执行。之后,它会根据您使用大小手柄为控件设置的大小而定。适合在设计时初始化。

protected override void OnControlAdded(ControlEventArgs e)
{
    base.OnControlAdded(e);
    if (this.IsHandleCreated)
    {
        base.BeginInvoke(new Action(() =>
        {
            e.Control.Size = new Size(100, 100);
            var svc = this.GetService(typeof(IComponentChangeService)) 
                          as IComponentChangeService;
            if (svc != null)
                svc.OnComponentChanged(e.Control, 
                   TypeDescriptor.GetProperties(e.Control)["Size"], null, null);
        }));
    }
}