簡體   English   中英

當可以從 WPF 和 WinForm 應用程序打開相同的對話框時,為對話框設置父級

[英]Set Parent for the dialog box when the same dialog box can be opened from both WPF and WinForm application

我有一個應用程序,它有 2 個模塊(一個由 WinForms 制成,另一個由 WPF 制成)。 我在兩個模塊上都有一個導出按鈕。

導出按鈕用於將網格導出到 Excel 文件並保存在我的本地。

單擊“導出”按鈕時,我有一個通用方法(ExportToExcel())將網格導出到 excel。

現在正如我所說,我的應用程序同時使用了 WPF 和 WinForms,現在當用戶單擊第一個模塊(WinForms)上的導出按鈕時,導出對話框打開,現在如果用戶單擊第二個模塊(WPF)的導出按鈕問題在進行 OLE 調用之前,必須將當前線程設置為單線程單元 (STA) 模式。 確保您的 Main 函數上標記了 STAThreadAttribute。 僅當調試器附加到進程時才會引發此異常。 我已經使用thread.SetApartmentState(ApartmentState.STA)更正了應用線程,如下面的代碼所示。

現在使用線程並將 ApartmentState 設置為 STA 后的問題是父級已從“導出”對話框中刪除,該對話框應該是單擊“導出”按鈕並打開對話框的特定模塊(第一個或第二個),現在對話框的父級是窗口而不是應用程序模塊(第一個或第二個)。

另一個問題是,由於沒有為導出對話框設置父級,如果用戶多次單擊導出按鈕,則會打開多個導出對話框,這是不正確的,一旦單擊導出按鈕並打開對話框,除非用戶完成對對話框的操作或將其關閉,否則用戶不應再次單擊導出框。

我的要求是,對話框的父級應該是打開對話框的一個模塊,並且用戶在對話框操作完成之前不能對應用程序執行任何操作。

導出按鈕單擊的代碼

public void ExportToExcel(UltraGrid gridToExport, UltraGridExcelExporter ultraGridExcelExporter, string name)
{
    Thread thread = new Thread((ThreadStart)(() =>
    {
     // code to open dialog box and perform operation on it.
    }));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

我不確定你說的是什么,但試試這個:


   //You need to enable (IsMdiContainer)
   //Example, in your WindowsForms set:
   this.IsMdiContainer = true;

   WpfMenu formMenu = new WpfMenu();
   formMenu.MdiParent = this;
   formMenu.Show();

這使得“表單菜單”成為正在執行的表單的子項,我相信它也適用於 WPF

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM