У меня есть пользовательский элемент управления, который действует как панель в компактном каркасе, , и мне нужно реализовать 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();
}
Событие ControlAdded предназначалось для этого. Не уверен, поддерживает ли CF его, что сложно проверить в эти дни. –
@HansPassant: В этом проблема, CF не поддерживает его. а также не поддерживает «AutoSizeMode» .... –
Во втором вопросе довольно легко прослушать событие изменения размера дочерних элементов управления, чтобы узнать, когда вам нужно позвонить в 'AutoGrow()' – tcarvin