我使用所提供的消息框WPF工具包 。 而我得到的错误
调用线程必须为STA,因为许多UI组件都需要这
new Thread(new ThreadStart(delegate
{
MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
})).Start();
我如何设置的ApartmentState在这种情况下,
编辑:我想显示使用WPF工具包的MessageBox控制无模式的MessageBox。 到目前为止,我的代码如下:
void SomeFunction()
{
// calls to some UI, and processing and then
var th = new Thread(new ThreadStart(delegate
{
MessageBox.Show("Opeartion could not be completed. Please try again.",
"Error", MessageBoxButton.OK, MessageBoxImage.Error);
}));
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
}
喜欢的用户界面的框架,像许多Windows窗体,WPF还规定单个线程模型,这意味着你只能访问创建它指定的衍生DispatcherObject的线程。 在Windows窗体实现接口ISynchronizeInvoke控制,该接口公开了一组方法,如调用和BeginInvoke的征收,我们可以用它来从另一个线程访问控制合同常见的线程同步。 在WPF中,我们也有这样的事,但这些操作都参与了一个名为Dispatcher类,调度WPF是允许这种线程同步模型的方式。
以下是如何当呼叫者是在不同的线程修改TextBox.Text属性的示例:
// Resets textbox text from another thread
textBox.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
textBox.Text = "New text";
}));
EDITED
根据MSDN存在着WPF内置的模态消息框,但如果你想使用无模式的MessageBox,那么你必须创建自定义窗口,然后显示它。 创建,显示和从定制的模态消息框返回的值是不是很艰难的。 你可以看到这个链接
这不是明智的使用不同的线程只有消息框。 反正你可以按照设定的单身公寓状态...
Thread th = new Thread(new ThreadStart(delegate
{
MessageBox.Show("Opeartion could not be completed. Please try again.", "Error",MessageBoxButtons.OK,MessageBoxImage.Error);
}));
th.ApartmentState = ApartmentState.STA;
th.Start();
// enable unit test to mock a dispatcher
var dispatcher = Dispatcher.CurrentDispatcher;
if (Application.Current != null)
{
// use the application dispatcher if running from the software
dispatcher = Application.Current.Dispatcher;
}
if (dispatcher != null)
{
// delegate the operation to UI thread.
dispatcher.Invoke(
delegate
{
MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
});
}
文章来源: The calling thread must be STA, because many UI components require this WPF