Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 只有在控件移动到直线上时,才会绘制该直线_C#_.net - Fatal编程技术网

C# 只有在控件移动到直线上时,才会绘制该直线

C# 只有在控件移动到直线上时,才会绘制该直线,c#,.net,C#,.net,我有一组自定义控件和一个几何对象列表,需要在同一个控制柄上绘制 我覆盖OnPaint过程,将base.OnPaint(e)放在第一行,并开始绘制几何对象(通过e.Graphics.DrawLine等)。 这些都在一个锁定列表中,并在一段时间后衰减。 自定义控件也可以在窗口中移动 现在,除了这个有趣的事实外,这几乎是按预期工作: 只有在控件沿其布局移动/在其布局上方移动后,才会出现 我能够在一个小环境中重现这一点: 我尝试刷新图形对象;保存/恢复;更换剪辑。 似乎什么都没用 我猜只有当控件存在时,

我有一组自定义控件和一个几何对象列表,需要在同一个控制柄上绘制

我覆盖
OnPaint
过程,将
base.OnPaint(e)
放在第一行,并开始绘制几何对象(通过
e.Graphics.DrawLine
等)。 这些都在一个锁定列表中,并在一段时间后衰减。 自定义控件也可以在窗口中移动

现在,除了这个有趣的事实外,这几乎是按预期工作:

只有在控件沿其布局移动/在其布局上方移动后,才会出现

我能够在一个小环境中重现这一点:

我尝试刷新图形对象;保存/恢复;更换剪辑。 似乎什么都没用

我猜只有当控件存在时,区域才会失效并重新绘制。但是我怎样才能强制绘制它们呢?

将告诉框架需要重新绘制控件。例如,当鼠标遮挡了控件的一部分后,它会自动重新绘制控件,但它只会重新绘制鼠标覆盖的一小部分(因此,您最终会使用鼠标重新绘制)同样,移动一个窗口会迫使它重新绘制,就像用另一个窗口覆盖它,然后再次移动那个窗口一样


但是,如果您正在进行一系列自定义绘制,您需要让它知道需要自己调用
Invalidate
来重新绘制控件。

您可能正在寻找或取决于您是Winforms还是WPF。哦。现在我觉得XD很愚蠢。我想
control.Invalidate
只会触发控件重新绘制所以我甚至没有考虑过。好吧,这就是诀窍。