Как я могу реализовать свойство AutoSize для пользовательского элемента управления? - PullRequest
5 голосов
/ 25 марта 2012

Я хочу реализовать свойство AutoSize в пользовательском элементе управления (, а не пользовательский элемент управления) таким образом, чтобы оно действовало подобно другим стандартным элементам управления .NET WinForms, которые реализуют AutoSize (ala CheckBox) в режиме разработки.

У меня настроено свойство, но это вызывает поведение элемента управления в режиме разработки. его можно изменить, но это не имеет смысла, поскольку визуальное изменение размера не отражено в свойствах AutoSize и Size, которые я реализовал.

Стандартные элементы управления .NET не позволяютизменение размера (или даже показ ручек изменения размера) в режиме конструктора, когда AutoSize имеет значение true.Я хочу, чтобы мой элемент управления вел себя таким же образом.

Редактировать : он работает с использованием переопределения SetBoundsCore (), но визуально не ограничивает aизменить размер, если для параметра AutoSize установлено значение true, это просто имеет тот же эффект;функциональность эквивалентна, но она кажется неестественной.

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
    if (!this.auto_size)
        this.size = new Size(width, height);
    base.SetBoundsCore(x, y, this.size.Width, this.size.Height, specified);
}

Есть какие-нибудь идеи сделать это стандартным способом?

Ответы [ 4 ]

5 голосов
/ 16 октября 2013

Вот мой рецепт, чтобы ваш элемент управления AutoSize.

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

Создайте метод ResizeForAutoSize (), чтобы заставить элемент управления изменять свой размер после изменения его состояния.Например, если размер элемента управления соответствует размеру текста, который он содержит, изменение текста должно изменить размер элемента управления.Просто вызовите этот метод при изменении текста.

Переопределите GetPreferredSize (), чтобы уведомить того, кто хочет знать (например, FlowLayoutPanel), какой наш предпочтительный размер.наше правило определения размера аналогично тому, как размер авторазмера не может быть изменен.

См. пример здесь.

/// <summary>
/// Method that forces the control to resize itself when in AutoSize following
/// a change in its state that affect the size.
/// </summary>
private void ResizeForAutoSize()
{
    if( this.AutoSize )
        this.SetBoundsCore( this.Left, this.Top, this.Width, this.Height,
                    BoundsSpecified.Size );
}

/// <summary>
/// Calculate the required size of the control if in AutoSize.
/// </summary>
/// <returns>Size.</returns>
private Size GetAutoSize()
{
    //  Do your specific calculation here...
    Size size = new Size( 100, 20 );

    return size;
}

/// <summary>
/// Retrieves the size of a rectangular area into which
/// a control can be fitted.
/// </summary>
public override Size GetPreferredSize( Size proposedSize )
{
    return GetAutoSize();
}

/// <summary>
/// Performs the work of setting the specified bounds of this control.
/// </summary>
protected override void SetBoundsCore( int x, int y, int width, int height,
        BoundsSpecified specified )
{
    //  Only when the size is affected...
    if( this.AutoSize && ( specified & BoundsSpecified.Size ) != 0 )
    {
        Size size = GetAutoSize();

        width   = size.Width;
        height  = size.Height;
    }

    base.SetBoundsCore( x, y, width, height, specified );
}
0 голосов
/ 09 мая 2019

Вам нужно всего лишь добавить эти две строки поверх вашей декларации пользовательского элемента управления

[Designer("System.Windows.Forms.Design.LabelDesigner")]
[ToolboxItem("System.Windows.Forms.Design.AutoSizeToolboxItem")]

И естественным образом реализовать вашу Autosize логику

0 голосов
/ 11 июня 2013

Переопределить SizeFromClientSize() метод. в этом методе вы должны рассчитать необходимый размер для вашего элемента управления и вернуть его.

0 голосов
/ 05 апреля 2012

В конструкторе вашего элемента управления вызовите SetAutoSizeMode (AutoSizeMode.GrowAndShrink).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...