我有一个像这样的wpf应用程序:
public CreateProject()
{
InitializeComponent();
_3DCAO.Temporary3DCAO.Close = false;
Userinitial fen = new Userinitial();
container.Content = fen;
Thread windowThread2 = new Thread(delegate() { verifing2(); });
windowThread2.IsBackground = true;
windowThread2.Start();
}
public void verifing2()
{
bool condition_accomplished = false;
while (!condition_accomplished)
{
if (Temporary3DCAO.Etape == 1)
{
_3DCAO.Settings set = new Settings();
if (container.Dispatcher.CheckAccess())
{
container.Content = set;
}
else
{
container.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
container.Content = set;
}));
}
condition_accomplished = true;
}
}
}
在方法Verifing
中,我想实现User Control
_3DCAO.Settings set = new Settings();
但是出现了这个错误:
The calling thread must be STA, as required by many components of the user interface
答案 0 :(得分:1)
WPF(实际上所有Windows GUI交互)必须在单个GUI线程上进行任何GUI交互,因为GDI(在Windows中处理GUI的子系统)是单线程的。一切都必须在那个线程上。该线程也是一个STA线程。
您正在更改容器,设置内容,并且您正在错误的线程上执行此操作。有办法让它到正确的线程。
在构造函数中或在调用InitializeComponents()之后,添加此
this.guiContext = SynchronizationContext.Current;
..其中guiContext的类型为System.Threading.SynchronizationContext。然后,您可以将工作发送到GUI线程:
guiContext.Send(this.OnGuiThread, temp);
OnGuiThread是一个以对象为参数的方法,temp是发送给它的对象。
这意味着重新组织代码,因为您不仅需要在线程上创建GUI对象(如代码中的“set”),而且只能在该线程上更改它们。
干杯 -