Переопределить AutoSize для производного элемента управления Label в C # - PullRequest
0 голосов
/ 15 декабря 2010

Я пытаюсь расширить класс System.Windows.Forms.Label для поддержки вертикально нарисованного текста. Я делаю это, создавая новое свойство под названием MyLabelOrientation, которое пользователь может установить в горизонтальное или вертикальное положение. Когда пользователь изменяет этот параметр, значения ширины и высоты меняются местами, чтобы изменить размер элемента управления в его новой ориентации. Наконец, я перезаписываю функцию OnPaint, чтобы нарисовать мою метку.

Я также хотел бы расширить свойство AutoSize для этого элемента управления, чтобы метка автоматически изменяла размер текста, который он содержит. Для горизонтальной ориентации базовая функциональность реализует это для меня. Для вертикальной ориентации я создаю объект Graphics и устанавливаю высоту элемента управления равной ширине объекта SizeF, возвращаемого из Graphics.MeasureString (Text, Font). Вы можете увидеть пример кода, который я использую ниже.

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;

public class MyLabel : Label
{
    public enum MyLabelOrientation {Horizontal, Vertical};
    protected MyLabelOrientation m_orientation = MyLabelOrientation.Horizontal;

    [Category("Appearance")]
    public virtual MyLabelOrientation Orientation
    {
        get { return m_orientation; }
        set
        {
            m_orientation = value;
            int temp = Height;
            Width = Height;
            Height = temp;
            Refresh();
        }
    }

    private Size ResizeLabel()
    {
        Graphics g = Graphics.FromHwnd(this.Handle);
        SizeF newSize = g.MeasureString(Text, Font);
        if (m_orientation == MyLabelOrientation.Horizontal)
            Width = (int)newSize.Width;
        else
            Height = (int)newSize.Width;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Brush textBrush = new SolidBrush(this.ForeColor);

        if (m_orientation == LabelOrientation.Vertical)
        {
            e.Graphics.TranslateTransform(Width, 0);
            e.Graphics.RotateTransform(90);
            e.Graphics.DrawString(Text, Font, textBrush, Padding.Left, Padding.Top);
        }
        else
        {
            base.OnPaint(e);
        }
    }
}

Однако установка AutoSize в значение true, по-видимому, предотвращает и / или отменяет любые изменения в размере элемента управления. Это означает, что я не могу изменить ширину или высоту, когда я хочу изменить ориентацию метки. Мне интересно, можно ли изменить это поведение, чтобы я мог проверить, установлен ли AutoSize, а затем настроить размер элемента управления в соответствии с его ориентацией.

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

Я не делал этого раньше, я полагаю, что вы теоретически можете переопределить объявление свойства (через ключевое слово new) и проверить ориентацию, прежде чем продолжить:

override public bool AutoSize
{
   set 
   {
      if( /* orientation is horizontal */ )
      {
          base.AutoSize = value;
      }
      else
      {
          // do what you need to do
      }    
   }    
}
0 голосов
/ 25 сентября 2018

Я знаю, что это довольно старый вопрос, но я наткнулся на него сегодня и задавался вопросом, как сделать то же самое.

Моим решением проблемы было переопределение метода GetPreferredSize(Size proposedSize).Я использовал класс кнопок со стрелкой, в дополнение к тексту, который, конечно же, не учитывался при использовании свойства AutoSize, поэтому я добавил дополнительное пространство, и он прекрасно работает для меня.

Учитывая проблемуизменив ориентацию или переключив ширину и высоту, вы можете полностью изменить способ вычисления предпочтительного размера.

public override Size GetPreferredSize(Size proposedSize)
{
    Size s = base.GetPreferredSize(proposedSize);
    if (AutoSize)
    {
        s.Width += 15;
    }
    return s;
}
0 голосов
/ 06 февраля 2013

Если вы думаете, что решение заключается в переопределении OnResize самого себя:

protected override void OnResize(EventArgs e)
{
    if (AutoSize)
    {
        // Perform your own resizing logic
    }
    else
        OnResize(e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...