对控件执行C#跨线程SendToBack / BringToFront操作

时间:2011-11-19 20:23:12

标签: c# controls z-index picturebox multithreading

我正在开发纸牌游戏。我用PictureBox类代表了卡片。我有一个游戏,玩家将卡片一个接一个地放在另一个上面。所有这些卡的Z-index都不同,当卡放在顶部时,我用这段代码给它顶部的z-index:

PictureBox cardPictureBox = move.Card.CardPictureBox;
if (cardPictureBox.InvokeRequired) 
    cardPictureBox.Invoke(new MethodInvoker(cardPictureBox.BringToFront));

此代码工作正常,并且所有卡片都应该在他们应该的时候被带到前面。这场比赛结束时我遇到了问题。那时我需要将PictureBox对象放回原来的位置。我把它们放回去,但是现在它们没有订购,因为我在Designer中订购它们。我必须重新安排他们的z索引。我使用相同的代码执行此操作,但是在循环中我为每张卡执行相同的操作。

程序不会抛出异常,只是冻结,就是这样!?!?! 有人遇到过这个问题,并且有答案吗?

如何在不冻结程序的情况下对PictureBox z-index进行安全的跨线程更改?

提前致谢

1 个答案:

答案 0 :(得分:0)

最简单的方法是在最后一个循环中完成所有操作时跳过调用:

foreach (CardPictureBox cardPB in Collection) 
{
    cardPB.BringToFront();
}