簡體   English   中英

如何獲得是否將控件添加到我的UserControl ControlsCollection的指示?

[英]how to get an indication if a control was added to my UserControl ControlsCollection?

我有一個用戶控件,它像緊湊框架中的面板一樣工作,並且需要在其上實現AutoSizeMode 我已經編寫了計算內部所有控件的大小所需的代碼,並且一切正常。

我唯一的問題是我沒有任何關於何時從UserControl添加或刪除控件的指示。

目前,我已經在UserControl中添加了一個方法,可以添加控件並根據需要調整用戶控件的大小,但這會迫使使用此UserControl的任何人都使用此方法,而不是標准Controls.Add

此外,我不知道如何調整內部控件的大小(盡管在可預見的將來不會發生這種情況,所以並不那么重要)。 (感謝tcarvin向我指出了監聽內部控件resize事件的簡單解決方案)

這是我當前的代碼:

protected void AutoGrow()
{
    if (this.AutoGrowMode != AutoGrowMode.None)
    {
        Size ContentSize = CalculateContentSize();
        int newWidth = this.Size.Width,
            newHeight = this.Size.Height;

        if ((this.AutoGrowMode & AutoGrowMode.Width) == AutoGrowMode.Width && this.Size.Width < ContentSize.Width)
        {
            newWidth = Math.Max(this.Size.Width, ContentSize.Width) + _margin * 2;
        }
        if ((this.AutoGrowMode & AutoGrowMode.Height) == AutoGrowMode.Height && this.Size.Height < ContentSize.Height)
        {
            newHeight = Math.Max(this.Size.Height, ContentSize.Height) + _margin * 2;
        }
        this.Size = new Size(newWidth, newHeight);
        this.Invalidate();
    }
}

protected Size CalculateContentSize()
{
    int MaxBottom = 0,
        MaxRight = 0;
    foreach (Control c in this.Controls)
    {
        MaxBottom = (MaxBottom < c.Bottom) ? c.Bottom : MaxBottom;
        MaxRight = (MaxRight < c.Right) ? c.Right : MaxRight;
    }
    return new Size(MaxRight, MaxBottom);
}

public void AddControl(Control value)
{
    this.Controls.Add(value);
    value.Resize += new EventHandler(ChildControl_Resize);
    AutoGrow();
}

private void ChildControl_Resize(object sender, EventArgs e)
{
    AutoGrow();
}

您可以通過將其添加到UserControl代碼中來提供自己的Controls集合:

    protected override ControlCollection CreateControlsInstance()
    {
        ObservableControlCollection controls = new ObservableControlCollection(this);
        controls.ControlAdded += new Action<Control>(controls_ControlAdded);
        return controls;
    }

    void controls_ControlAdded(Control addedControl)
    {
        Debug.WriteLine("Control added:" + addedControl.Name);
    }

    private sealed class ObservableControlCollection : ControlCollection
    {
        public event Action<Control> ControlAdded;

        public ObservableControlCollection(Control owner)
            : base(owner)
        {
        }

        public override void Add(Control control)
        {
            base.Add(control);

            Action<Control> handler = ControlAdded;
            if (handler != null)
            {
                handler(control);
            }
        }

        // Similarly for removing controls:
        public override void Remove(Control value) { ... }
        public override void Clear() { ... }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM