winforms 在清除某些条件后,是否有任何方法可以调用OnPaint()方法?

xtfmy6hx  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我的桌面现在真的很乱,所以我决定创建一个程序,在那里你可以拖动一个文件,它会创建一个快捷方式。当文件被拖进来时,我抓取文件的图标和名称并保存,然后通过OnPaint()将它们绘制到WinForm。不过,我在这方面遇到了麻烦,因为甚至在我将文件拖到表单中之前,OnPaint()就绘制了一个巨大的红色X,并且没有更新。下面是我的代码(一张图片):

OnPaint方法:

我的问题是,有没有办法延迟OnPaint()方法,直到它获得正确绘制所需的某些数据,或者我可以使用任何其他绘制方法将图标+文件名粘贴到WinForm?
我试过使用Thread.Sleep,但后来我意识到它会让主线程休眠,所以拖放过程不会发生

gcxthw6b

gcxthw6b1#

我有两个选择。
第一个是我在评论中所说的。使表单无效,以使OnPaint在拖放后被调用:

foreach (string path in filePath)
{
    // your other code here (PS: Paste code next time)
}

this.Invalidate();

你的另一个选择..使用一个可以在OnPaint中检查的标志:

bool canDraw = false;

// dragdrop event:

foreach (string path in filePath)
{
    // your other code here (PS: Paste code next time)
}

canDraw = true;

// OnPaint:

if (canDraw) {
    // do your painting here

    canDraw = false;
}

base.OnPaint(e); // make sure you defer to the base painting method too

第二种选择有效地延迟你的画,直到你说它的好。但只有你的定制画你把base.OnPaint调用从你的条件中去掉,这样它就可以在需要的时候进行绘制。

相关问题