[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.StatusStrip)]
public partial class SpringLabel : ToolStripStatusLabel
{
public SpringLabel()
{
this.Spring = true;
}
protected override void OnPaint(PaintEventArgs e)
{
var flags = TextFormatFlags.Left | TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
var bounds = new Rectangle(0, 0, this.Bounds.Width, this.Bounds.Height);
TextRenderer.DrawText(e.Graphics, this.Text, this.Font, bounds, this.ForeColor, flags);
}
}
this效果很好,但缺少对母体控制的各种属性的支持,例如
BorderSides
以及对图像等的任何支持。是否有一种方法可以获取ToolStripStatusLabel
代码尝试复制或模仿其某些行为?我真的没有关于从哪里开始寻找的想法。 按 @hans建议添加解决方案
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.StatusStrip)]
public partial class SpringLabel : ToolStripStatusLabel
{
private string? _sltext;
public new string? Text
{
get => _sltext;
set { _sltext = value; ToolTipText = _sltext; Invalidate(); }
}
public SpringLabel()
{
this.Spring = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var flags = TextFormatFlags.Left | TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
var bounds = new Rectangle(0, 0, this.Bounds.Width, this.Bounds.Height);
TextRenderer.DrawText(e.Graphics, _sltext, this.Font, bounds, this.ForeColor, flags);
}
}
LayoutStyle
的默认值。
您不会通过创建自定义
Table
来获得所需的结果,除非您自己绘制标签的所有部分。图像,文字,边界...等。每个都有一组属性,这些属性默认的renderer用来将它们绘制在其overridable的方法中。这意味着,您可以创建一个自定义渲染器,覆盖相关的方法,以绘制标签的不同部分,或者调整专用
ToolStripStatusLabel
的属性 - 如果可能的话 - 并调用基本方法来执行休息
例如,以下内容。
OnRenderXXX
...仅此而已。
xxxEventArgs
方法覆盖的设计行为来覆盖这一点,并自己绘制图像。这还需要覆盖
public class TSRenderer : ToolStripProfessionalRenderer
{
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
if (e.Item is ToolStripStatusLabel lbl)
{
if (lbl.Image is not null)
{
Rectangle r = e.TextRectangle;
Size scaleSize = lbl.Owner!.ImageScalingSize;
if (r.X < scaleSize.Width)
{
r.X += scaleSize.Width + 1;
r.Width -= r.X + 1;
}
e.TextRectangle = r;
}
e.TextFormat = TextFormatFlags.Left |
TextFormatFlags.VerticalCenter |
TextFormatFlags.EndEllipsis;
}
base.OnRenderItemText(e);
}
protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e)
{
if (e.Item is ToolStripStatusLabel && e.Image is not null)
{
var r = e.ImageRectangle;
r.Width = r.Height;
r.X += 2;
e.Graphics.DrawImage(e.Image, r);
}
else
{
base.OnRenderItemImage(e);
}
}
}
// Use it...
public partial class SomeForm : Form
{
public SomeForm()
{
InitializeComponent();
yourStatusStrip.Renderer = new TSRenderer();
someToolStripStatusLabel.AutoSize = false; // Must do.
someToolStripStatusLabel.Spring = true;
}
}
方法 - 除了应用所需的OnRenderItemImage
标志之外,还需要修复文本矩形,以使其不会重叠映像矩形,因为渲染器在绘制文本之前绘制图像绘制图像。
最终注释,将OnRenderItemText
属性设置为
TextFormatFlags.EndEllipsis
,以确保在最小化容器形式并恢复容器时也调用了覆盖方法。