【发布时间】:2013-11-18 10:45:47
【问题描述】:
我有一个场景,我必须将 Form 的一个实例调用为 ShowDialog()。 我的代码是这样的:
Form view = ComponentFactory.GetInstance<IView>
(viewConfig.Key) as Form;
if (view == null)
{
if (_sysLog.IsErrorEnabled)
_sysLog.Error("Invalid view configuration. Aborting!");
throw new AbstractModelException("View not found.");
}
if (isFixed)
view.FormBorderStyle = FormBorderStyle.FixedDialog;
view.StartPosition = FormStartPosition.CenterScreen;
view.ShowInTaskbar = false;
view.FormClosed += new FormClosedEventHandler(OnViewClosed);
view.FormClosing += new FormClosingEventHandler(OnViewClosing);
if (view is IView)
{
InitializeView((IView)view);
((IView)view).Tag = tag;
}
if (parentWindow != null && parentWindow is IWin32Window)
return view.ShowDialog(parentWindow as IWin32Window);
return view.ShowDialog();
我已将引用从 .net 3.5 转换为 4.0。
Error is:
Cross-thread operation not valid: Control '' accessed from a thread other than the
thread it was created on.
这表明表单控件已经在 UI 线程中运行。
我已经尝试解决了
if(view.InvokeRequired)
{
MethodInvoker method = new MethodInvoker(() => view.ShowDialog());
DialogResult result = (DialogResult)view.Invoke(method);
}
我已经尝试过 Invoke 和 BeginInvoke 两者。每次 InvokeRequired 在这里都是假的。
我也试过打电话给view.CreateControl,因为我可能在某些地方读到过
尚未创建表单控件并且未创建表单句柄。
但这也行不通。
ShowDialog 响应返回时每次都会出现错误。通过 ShowDialog 这个
打开表单并在表单关闭时处理后返回一个
对话结果。之后,这将返回到另一个调用当前函数的类。
请指导。
【问题讨论】:
-
表单是在哪个线程上创建的? creating 线程对 UI 控件很重要。这就是为什么您应该始终在 UI 线程上创建控件/表单...另外:所有控件是否都创建在 在同一个线程上?
-
没有任何线程。在这里,我们以 View 的形式打开表单。每个视图都添加到 app.config 文件中。当前代码是在 ViewManager.cs 中编写的,每个视图都是从其中打开的。
-
如果你想更清楚,请告诉我