【问题标题】:C# cross-thread SendToBack/BringToFront operations on controls控件上的 C# 跨线程 SendToBack/BringToFront 操作
【发布时间】:2012-01-02 01:52:49
【问题描述】:

我正在开发一款纸牌游戏。我用 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?

提前致谢

【问题讨论】:

  • 你应该使用 BeginInvoke 而不是 Invoke。

标签: c# controls z-index picturebox multithreading


【解决方案1】:

最简单的方法是在最后循环执行所有调用时跳过调用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多