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