2015-07-16 6 views
1

У меня есть пользовательский элемент управления, который действует как панель в компактном каркасе, , и мне нужно реализовать AutoSizeMode на нем. Я написал код, необходимый для расчета размера всех элементов управления внутри, и все работает нормально.как получить указание, если элемент управления был добавлен в элемент UserControl ControlsCollection?

Моя единственная проблема в том, что у меня нет никаких указаний, когда элемент управления добавлен или удален из моего UserControl.

Currntly, я добавил метод в свой UserControl для добавления элементов управления и изменения размера пользовательского элемента управления, если это необходимо, но это заставляет всех, кто использует этот UserControl, пройти этот метод вместо стандартного Controls.Add.

Кроме того, я не знаю, как получить указание при изменении размера внутреннего элемента управления (хотя это не произойдет в обозримом будущем, поэтому не так важно). (спасибо tcarvin указал мне на простое решение прослушивания внутреннего контроля изменения размера событий)

Вот мой текущий код:

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(); 
} 
+0

Событие ControlAdded предназначалось для этого. Не уверен, поддерживает ли CF его, что сложно проверить в эти дни. –

+0

@HansPassant: В этом проблема, CF не поддерживает его. а также не поддерживает «AutoSizeMode» .... –

+0

Во втором вопросе довольно легко прослушать событие изменения размера дочерних элементов управления, чтобы узнать, когда вам нужно позвонить в 'AutoGrow()' – tcarvin

ответ

2

Вы можете предоставить свою собственную Controls коллекцию, добавив это ваш UserControl код:

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() { ... } 
    } 
+0

Большое спасибо! Протестировано и работает как шарм. не может наградить щедрость в течение следующих 18 часов, но сделаю, как только смогу. –

+0

@ ZoharPeled Спасибо, рад, что я мог бы помочь :) –