Я сам столкнулся с этой проблемой и в итоге создал свой собственный простой элемент управления Label.
.Net Label control - удивительно сложный зверь, поэтому он медленнее, чем хотелось бы.
Вы можете создать класс, который наследует Control
, вызвать SetStyle
в конструкторе, чтобы сделать его буферизованным и нарисованным пользователем, затем переопределить метод OnPaint
для вызова e.Graphics.DrawString
и нарисовать Text
свойство.
Наконец, переопределите Text
или TextChanged
и позвоните Invalidate
.
Пока вам не нужен AutoSize, это будет значительно быстрее, чем стандартный элемент управления Label.
Вот моя реализация: (В настоящее время используется в производстве)
///<summary>A simple but extremely fast control.</summary>
///<remarks>Believe it or not, a regular label isn't fast enough, even double-buffered.</remarks>
class FastLabel : Control {
public FastLabel() {
SetStyle(ControlStyles.AllPaintingInWmPaint
| ControlStyles.CacheText
| ControlStyles.OptimizedDoubleBuffer
| ControlStyles.ResizeRedraw
| ControlStyles.UserPaint, true);
}
protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); Invalidate(); }
protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e); Invalidate(); }
static readonly StringFormat format = new StringFormat {
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.DrawString(Text, Font, SystemBrushes.ControlText, ClientRectangle, format);
}
}
Если вы не хотите центрироваться, вы можете избавиться или изменить StringFormat
.