【问题标题】:C# Labels TextAlign doesn't work after OnPaint overrideC# 标签 TextAlign 在 OnPaint 覆盖后不起作用
【发布时间】:2014-09-20 15:38:05
【问题描述】:

我的标签的TextAlign 属性有问题。我基于标签类创建了一个新类来覆盖OnPaint 事件。我不得不覆盖它,因为我不希望标签在禁用时更改 ForeColer

我真的不想禁用标签,因为它没有意义,但标签位于另一个必须禁用的控件中,因此标签也被禁用。

我使用了这个OnPaint 方法,它允许我设置任何我想要的前导器,即使它被禁用:

protected override void OnPaint(PaintEventArgs e)
    {
        TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
    }

但现在 TextAlign 属性由于新的 OnPaint 方法而不起作用。

您对实现这两个要求有什么建议吗?禁用标签时ForeColor 的更改以及通过TextAlign 属性对齐文本的选项。

【问题讨论】:

  • 是实现文本对齐的Label.OnPaint()方法。既然你推翻了它,这就是你现在的工作。使用采用 TextFormatFlags 和 Rectangle 参数的 DrawText() 重载。根据需要使用 Left/Horizo​​ntalCenter/Right 和 Top/VerticalCenter/Bottom。
  • 感谢您的评论。我找到了标签link 的源代码,我认为我不应该覆盖 OnPaint,因为它做了很多事情。禁用控件时是否还有其他启用字体颜色的选项?
  • 禁用一个Label控件意义不大,它不是一个可以获得焦点的控件。故意混淆用户并隐藏鼠标单击不会做任何事情的事实更没有意义。做没有多大意义的事情应该是困难的。
  • 在这种情况下,我没有启用/禁用标签的选项。我将尝试解释:我构建了一个自己的用户控件。此用户控件具有自定义数量的图像,其作用类似于按钮。因此,该控件是“多按钮”控件。一切正常,因为我禁用了单个图片框(否则我无法单击控件),但标签位于这些图片框内,因此它们也被禁用。一个选项是将标签从图片框中取出,但这将是很多工作,因为我已经实现了很多东西。
  • 只需在 Paint 事件处理程序中绘制文本,而不是使用标签。禁用图片框也没什么意义,只需给它们一个通用的 Click 事件处理程序并调用 this.OnClick() 来触发用户控件的 Click 事件。虽然我想你会想声明你自己的事件,因为有人应该对点击了哪个特定的“按钮”感兴趣。顺便说一句,这是一个 XY 问题。

标签: c# winforms label text-alignment onpaint


【解决方案1】:

您缺少调用基类的 OnPaint 方法:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
}

看一看:http://msdn.microsoft.com/de-de/library/cksxshce%28v=vs.110%29.aspx

覆盖继承的事件

  1. 覆盖受保护的 OnEventName 方法。

  2. 从重写的 OnEventName 方法调用基类的 OnEventName 方法,以便注册的委托接收事件。

【讨论】:

  • 感谢您的评论,但这不是我想要的。当我调用基类时,我得到了两次文本。其中一个是灰色的,但在正确的位置,可以正常工作,另一个(通过 TextRenderer.Draw .... 绘制)为黑色(或任何其他颜色),但 align 不起作用。跨度>
【解决方案2】:

我今天遇到了这个问题,这是我对此事的分享。

基本上,既然你在打电话

extRenderer.DrawText(e.Graphics, this.Text.ToString(), 
    this.Font, ClientRectangle, ForeColor);

它将从左边缘呈现字符串(注意您发送的矩形,它从0,0开始。

我做了什么(在我的情况下,我将 TextAllign 设置为 ContentAlignment.MiddleRight 并设置了 TextFormatFlags.PathEllipsis,因为我在标签上呈现了一条路径 - 同时将其向右对齐):

protected override void OnPaint(PaintEventArgs e)
{
    // Measure text
    var textSize = TextRenderer.MeasureText(Text, Font);
    if (e.ClipRectangle.Width > textSize.Width)
    {
        var x = e.ClipRectangle.Width - textSize.Width;
        var rect = new Rectangle(x, 0, textSize.Width, textSize.Height);
        TextRenderer.DrawText(e.Graphics, Text, Font, rect, ForeColor, 
            TextFormatFlags.PathEllipsis);
        return;
    }

    TextRenderer.DrawText(e.Graphics, Text, Font, e.ClipRectangle, ForeColor, 
        TextFormatFlags.PathEllipsis);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2010-10-18
    • 2017-02-19
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多