[英]How to open a second Form as dialog when the first Form is already loaded?
[英]How to open a second form on the same thread of the first form?
我有2种形式的WinForms客户端。 第一种形式调用一个单独的类,该类使用'SignalR'来接收来自WebApi的通知。 该类中特定消息的中心代理的设置为:
onResult = myProxy.On<int>("Result", (id) =>
{
Result?.Invoke(this, new ResultEventArgs(id));
});
在第一种形式中,我订阅Result
事件,然后得到:
private void OnResult(object sender, ResultEventArgs e)
{
using (var form = new SecondForm(e))
{
var dialogResult = form.ShowDialog(this);
if (dialogResult == DialogResult.Cancel)
return;
}
}
我在var dialogResult = form.ShowDialog(this);
上得到了CrossThreadException
第一个表单( this
)在UI线程上打开。 第二种形式是在与SignalR
类使用的相同线程中打开的。
我确实需要使用ShowDialog(this)
打开第二个表单,因为我需要它成为应用程序中最顶层的表单。
有解决此问题的方法吗? 是否可以在UI线程中打开第二个表单?
更新:
一种可行的解决方法:
form.TopMost = true;
form.StartPosition = FormStartPosition.CenterScreen;
唯一的缺点是该表单是桌面上最顶层的表单,而不仅仅是应用程序内部。
您不能在单个UI线程以外的任何线程上创建,更改或访问任何UI控件。 您必须在现有控件上调用.Invoke(...)
,以将来自另一个线程的调用编组回UI。
尝试这个:
private void OnResult(object sender, ResultEventArgs e)
{
Action x = () =>
{
using (var form = new SecondForm(e))
{
var dialogResult = form.ShowDialog(this);
if (dialogResult == DialogResult.Cancel)
return;
}
};
this.Invoke(x);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.