【问题标题】:TextBox OnPaint method is not called?TextBox OnPaint 方法没有被调用?
【发布时间】:2016-06-21 12:22:43
【问题描述】:

我使用下面的代码创建了一个文本框,但是在文本框的任何情况下都不会触发paint方法。你能推荐一个触发 OnPaint() 的解决方案吗?

public class MyTextBox : TextBox
{
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        base.OnPaintBackground(pevent);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        ControlPaint.DrawBorder(e.Graphics,this.Bounds, Color.Red,ButtonBorderStyle.Solid);
        base.OnPaint(e);
    }

    protected override void OnTextChanged(EventArgs e)
    {
        this.Invalidate();
        this.Refresh();
        base.OnTextChanged(e);
    }
}

【问题讨论】:

  • 你调试没命中?你的DrawBorder 调用可能没用,因为你调用base.OnPaint() 之后。所以TextBox 再次覆盖你之前绘制的内容。

标签: c# .net winforms textbox onpaint


【解决方案1】:

默认情况下,不会在 TextBox 上调用 OnPaint,除非您将其注册为自绘控件,方法是调用:

SetStyle(ControlStyles.UserPaint, true);

例如来自您的 MyTextBox 构造函数。

【讨论】:

  • @VenkateshKs 如果这回答了您的问题,请将其标记为答案,以帮助未来有类似问题的用户。
  • 这修复了触发事件的问题,但搞乱了文本框的操作方式。
  • 这可能会调用 OnPaint,但现在它由系统以带有小插入符号的小字体绘制,并且我自己的 OnPaint 方法被透支了。切换到 RichTextbox 允许我自己绘制它,但插入符号仍由系统绘制。
  • 就像 René Vogt 提到的那样;默认文本框不支持绘制事件,并且使用:SetStyle(ControlStyles.UserPaint, true) 不可行。恕我直言,自定义文本框;为此目的,最好创建一个用户控件(从文本框派生)。需要一些工作和时间,但它会比尝试修改基本控件更好地工作和执行。
【解决方案2】:

您需要在OnPaint中切换通话

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    ControlPaint.DrawBorder(e.Graphics, this.Bounds, Color.Red, ButtonBorderStyle.Solid);
}

base.OnPaint() 像往常一样绘制TextBox。如果您在base 调用之前调用DrawBorder,它会再次被基础实现覆盖。


但根据documentationTextBox不支持Paint事件:

此 API 支持产品基础架构,并非旨在直接从您的代码中使用。
在重绘控件时发生。此事件与此类无关。

所以 Ben Jackon 的回答应该可以解决这个问题。

【讨论】:

  • 没关系。我要求点击 OnPaint 方法。
  • 我问触发了 OnPaint 方法。因为这个方法没有被触发。
  • @VenkateshKs 好的,Ben 得到了答案。我留下这篇文章,因为调用顺序仍然是您代码中的一个相关问题。
猜你喜欢
  • 2012-03-13
  • 2014-06-02
  • 2011-08-28
  • 2017-02-24
  • 2015-02-23
  • 2013-12-19
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多