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

时间:2013-02-05 17:55:43

标签: c# visual-studio events controls

我正在学习如何编写自定义控件以及管理和引发事件。 我已经创建了一个毫无意义的自定义控件,你可以在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中我尝试改变Line的颜色,则没有任何反应。 我必须使用以前的那些Proprieties intead:

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

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

1 个答案:

答案 0 :(得分:0)

如果您正在讨论更复杂的控制,请考虑将Refresh更改为Invalidate以使UserControl的特定区域无效。 要获取Graphics对象,只需调用CreateGraphics方法。