我有一個實作了自動更新方法的 Windows 桌面應用程式。我想顯示一個自定義表單(因為我需要更改按鈕文本)在檢測到新更新時詢問用戶是否要下載新版本并且我想“阻止”所有輸入操作桌面應用程式,直到用戶做出選擇。
在閱讀了 Form.ShowDialog() 檔案和這里的幾個主題后說“ShowDialog() 沒有使我的視窗成為模態”和幾個回答“你需要正確設定所有者”的答案,我仍然不明白如何設定這個所有者。當然,如果我制作兩種表格,第一個顯示第二個,我可以“阻止”第一個做:
secondForm.ShowDialog(firstForm);
但我不知道如何使 firstForm 阻止所有應用程式以防止用戶使用它的棄用版本。
我嘗試了幾種方法,例如獲取當前 id 行程(或嘗試獲取它)并將其轉換為 IWin32Window。但似乎沒有任何效果。
如果你需要它,我在這里添加我正在使用的代碼:
FormAsk formAsk = new FormAsk (param1, param2);
formAsk.StartPosition = FormStartPosition.CenterParent;
formAsk.TopLevel = true;
formAsk.TopMost = true;
formAsk.DialogResult = formAsk .ShowDialog();
if(formAsk.DialogResult.Equals(DialogResult.OK))
{
// do stuff
}
else
{
// do other stuff
}
我還看到了很多解決方案的實作:
myForm.ShowDialog(this);
但是VS開始哭了,因為型別不兼容。我正在使用 MVVM 模式,所以我不能只將表單設定為所有者,因為我沒有主表單。只是 .xaml 中的視圖和 c# 中的視圖控制器。
編輯:我想添加一些我在遇到這個問題后學到的評論,這可能有助于更好地理解我的情況。
程式的 main 方法執行以下操作:
[STAThread]
static void Main()
{
//stuff
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
//stuff
STAApplicationContext context = new STAApplicationContext();
Application.Run(context);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, Localization.Strings.error_popup_title);
Application.Exit();
}
}
}
這個背景關系是生成應用程式的服務層和視圖管理器的背景關系。如果我在服務層中顯示表單,showDialog() 方法不能“阻止”視圖中的輸入,但如果我從視圖中顯示它們(由視圖管理器生成和處理),我可以。視圖和服務之間存在通信,因為在視圖中觸發的操作會導致服務方法呼叫,但在這種情況下,我想要的通信是相反的:服務呼叫視圖控制器中的方法以通過 showDialog( )。
uj5u.com熱心網友回復:
您需要將IWin32Window介面的實體傳遞給 ShowDialog方法。
IntPtr myWindowHandle = IntPtr(parent.Handle);
IWin32Window w = Control.FromHandle(myWindowHandle);
uj5u.com熱心網友回復:
在你的第一個表單中做你的東西,無論你按下什么按鈕來創建你的第二個表單,就像這樣。(偽代碼)
button1_click()
{
Form2 = new Form()
Form2.Owner = this;
}
現在從您的 Form2 中,您可以使用 this.Owner.Visible = false 與您的所有者交談。
如果那是您所要求的,那就是您如何使所有者。
uj5u.com熱心網友回復:
感謝那些試圖幫助您回復的人。但是,盡管您的答案可能會在其他情況下起作用,但我的答案會有所不同。
最后我實作了解決它,我需要在更高的抽象級別中使用 Forms 來處理。管理的資訊是從異步任務中檢索的,因此我不能在那里使用 showDialog 方法并阻止應用程式的 MainWindow。相反,我做了幾個執行緒,等待它們并最終在需要時顯示對話框。這不是最好的方法,但鑒于背景關系是我唯一能做的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431273.html
上一篇:無法在以前的表單中插入資料-我在創建新表單時丟失了資料
下一篇:添加到串列時更改屬性名稱
