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