[英]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.