添加丢失的属性支持对工具的支持,该工具将覆盖覆盖的工具?

问题描述 投票:0回答:1
[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

...仅此而已。
c# winforms onpaint toolstripstatuslabel
1个回答
0
投票
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
,以确保在最小化容器形式并恢复容器时也调用了覆盖方法。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.