Я пытаюсь расширить класс 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, а затем настроить размер элемента управления в соответствии с его ориентацией.