我有应用程序,我正在使用后台工作程序来启动一些序列。 它有时需要更新GUI。
我有一些静态类,引用了一些gui对象。 在我的逻辑中,我想从这个静态类调用方法,使用一些参数,分析它并更新GUI。 但我有“调用线程无法访问此对象,因为不同的线程拥有它。”异常。
在第一个帖子中设置变量:
public static void SetCardHand(ref CardHand ch)
{
cardHand = ch;
}
从后台工作线程调用的方法:
private static void SetCoveredCardsPlayer0(int cardsNumber)
{
if (cardsNumber < 1)
cardHand.imgCard1.Source = null;
else
cardHand.imgCard1.Source = (ImageSource)WindowManager.Instance.CardsGUI.CardsDictionary["T1"];
}
如何让这种方法改变GUI?
这不是一个窗口类。它就像演示者一样。
它是纸牌游戏。我是在后台工作者中开始的,我需要在每次交易后更新图像源(代表卡片)。
答案 0 :(得分:5)
在更新UI之前,您必须将控制权传递回主线程。 BackgroundWorker使这很容易。
创建BackgroundWorker
时,请设置WorkerReportsProgress = true
。
订阅ProgressChanged
事件,并将更新用户界面的逻辑放入该事件中。
在DoWork
事件中,当您想要更新GUI时,请调用myBackgroundWorker.ReportProgress(0, someObject)
,其中“someObject”是您要处理的数据。在您的情况下,可能是您ImageSource
分配的cardHand.imgCard1.Source
。
在ReportProgress
事件中,您可以通过e.UserState
访问传递的对象。在使用之前,您需要将其强制转换为ImageSource
。
您可以将if (cardsNumber < 1)
逻辑保留在DoWork
事件中,但是当您要将Source
设置为ImageSource
(或null
)时,您需要将该值传递给ProgressChanged
事件才能实际更新UI元素。