I’m learning how to write custom control and manage and raise events.
I’have create a pointless custom control, a line you can add on main and decide size and color. I’ve made also an event to replace OnClick (I’m just learning) and I’ve called it MyClick. Here’s the code
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);
}
}
}
}
luckly everythings is working. I can see my control in the control toolbox and I can add to my project, even the event is working.
But, if inside MyClick i try to change the color of the Line, nothing happens.
I have to use this Proprieties intead of the ones before:
public Color LineColor
{
get { return _color; }
set { _color = value; this.Refresh(); }
}
public float LineSize
{
get { return _size; }
set { _size = value; this.Refresh(); }
}
So I’m asking myself if there is a better way to refresh the control. If I’m redrawing a single line is easy to be done, but if it is a more complex control? I thought to do a ‘Redraw’ private method but I don’t know how to access the ‘Graphic’ object of the EditedLine istance. Is ‘INotifyPropertyChanged’ useful? But the ‘Graphic’ still remains my biggest problem
If you are talking about more complex control, then consider to change
RefreshtoInvalidateto invalidate specific regions of your UserControl.To get
Graphicsobject just callCreateGraphicsmethod.