0

我正在使用分层表单,我在 Visual Basic .NET 中找到了一个很好的示例,但在将源代码转换为 C# 时遇到了问题。Visual Basic.NET 实现使用 shadows 修饰符来有效地替换 Form Class 的Invalidate()方法,然后对 Paint 事件执行相同的操作。

公共阴影事件绘制(ByVal G As Drawing.Graphics)

Public Shadows Sub Invalidate()
    Dim B As New Drawing.Bitmap(ClientSize.Width, ClientSize.Height)
    Dim G As Drawing.Graphics = Drawing.Graphics.FromImage(B) : G.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias

    RaiseEvent Paint(G)

    G.Dispose()
    SetBits(B)
    B.Dispose()
End Sub

我将代码转换为 C#,如下所示:

public new event PaintEventHandler Paint;

public new void Invalidate()
    {
        Bitmap b = new Bitmap(ClientSize.Width, ClientSize.Height);
        Graphics g = Graphics.FromImage(b);
        g.SmoothingMode = SmoothingMode.AntiAlias;

        Paint(this, new PaintEventArgs(g, Rectangle.Empty));

        g.Dispose();
        SetBits(b);
        b.Dispose();
    }

但是当调用该方法时,我收到NullReferenceException - 对象引用未设置为对象的实例。

我也尝试了不同的实现,但收到了相同的异常。

    public delegate void PaintEventHandler(Graphics g);
    public event PaintEventHandler Paint;

有人可以告诉我我做错了什么吗?谢谢。

4

2 回答 2

1

您需要在调用事件之前检查 null:

if (Paint != null)   
    Paint(this, new PaintEventArgs(g, Rectangle.Empty));
于 2012-08-22T13:37:15.827 回答
0

默认情况下,您的Paint事件不包含任何功能。您需要添加一些才能运行它。

Paint += new PaintEventHandler(Form1_Paint);

我在哪里声明:

void Form1_Paint(object sender, PaintEventArgs e)


您在程序中应该做的是调用该函数onPaint(),或者更好的是,将您的函数添加到Paint事件中,而不是覆盖它。

于 2012-08-22T13:48:27.187 回答