C# 刷新自定义控件的更好方法

C# 刷新自定义控件的更好方法,c#,visual-studio,events,controls,C#,Visual Studio,Events,Controls,我正在学习如何编写自定义控件、管理和引发事件。 我已经创建了一个无意义的自定义控件,一条可以添加到main上并决定大小和颜色的线。我还做了一个活动来代替OnClick(我只是在学习),我把它叫做MyClick。这是密码 public class EditedLine : UserControl { public delegate void LineClickEventHandler(object sender, EditedLineClickEventArgs e); [Des

我正在学习如何编写自定义控件、管理和引发事件。 我已经创建了一个无意义的自定义控件,一条可以添加到main上并决定大小和颜色的线。我还做了一个活动来代替OnClick(我只是在学习),我把它叫做MyClick。这是密码

public class EditedLine : UserControl
{
    public delegate void LineClickEventHandler(object sender, EditedLineClickEventArgs e);

    [Description("Occurs when control is clicked")]
    public event LineClickEventHandler MyClick;

    private Color _color;
    private float _size;

    public EditedLine()
    {
        _color = Color.Black;
        _size = 3;
    }
    public EditedLine(Color color, float size)
    {
        _color = color;
        _size = size;
    }

    public Color LineColor
    {
        get { return _color; }
        set { _color = value; }
    }
    public float LineSize
    {
        get { return _size; }
        set { _size = value; }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawLine(new Pen(_color, _size), new Point(0, 0), new Point(this.Size.Width, 0));
    }
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        OnLineClick(new EditedLineClickEventArgs());
    }

    protected virtual void OnLineClick(EditedLineClickEventArgs e)
    {
        if (MyClick != null)
        {
            MyClick(this, e);
        }
    }
}
}

幸运的是,一切都在起作用。我可以在控件工具箱中看到我的控件,并且可以添加到我的项目中,即使事件正在工作。 但是,如果在MyClick中尝试更改线条的颜色,则什么也不会发生。 我必须使用这些礼节来代替以前的礼节:

    public Color LineColor
    {
        get { return _color; }
        set { _color = value; this.Refresh();  }
    }
    public float LineSize
    {
        get { return _size; }
        set { _size = value; this.Refresh();  }
    }

所以我问自己是否有更好的方法刷新控件。如果我重画一行很容易,但如果它是一个更复杂的控件?我想做一个“重绘”私有方法,但我不知道如何访问EditedLine的“Graphic”对象。“INotifyPropertyChanged”有用吗?但是,“图形”仍然是我最大的问题

如果你正在谈论更复杂的控件,那么考虑将<代码>刷新< <代码> > <代码>无效> <代码>以使USER控件的特定区域无效。
要获取
Graphics
对象,只需调用
CreateGraphics
方法。

CreateGraphics擅长引起闪烁。建议使用绘画事件提供的图形对象。@LarsTech的问题是-如何获取图形对象
CreateGraphics
是肯定的事情。和
油漆
原因事件。但既然作者已经有了OnPaint事件,那么我就提到了
CreateGraphics
。将e.Graphic存储在一个私有变量中并在每次属性更改时调用_Graphic.DrawLine(假设我在OnPaint中完成了_Graphic=e.Graphic)是安全的吗?实际上,你不应该这样做。由于您的所有绘制都发生在
OnPaint
事件中,因此您已经有了
Graphics
对象。因此…我可以在properties内部自己调用OnPaint吗?我正在寻找重新绘制控件(或其一部分)的最佳方法,而不必在每次properties更改时调用refresh()