2011-09-21 64 views
2

我有一個tabpage用戶控件和3個屬性頁,用於tabpage用戶控件,它們是動態分配的。該tabpage控件將顯示在對話框中。如何在顯示Windows對話框後進行處理?

對於tabpage控件的數據處理和過濾需要更多的時間,並且這會導致在打開對話框之前出現超過10秒的繁忙圖標。

我想顯示一個空的Dialog打開並顯示繁忙的圖標,同時處理和數據過濾完成並最終顯示在Dialog內部。

這基本上改變了處理的順序。

但是,我無法做到這一點,並且一旦打開對話框,它將等待用戶輸入,並在給出輸入後纔會進入下一行。 (如在調試期間觀察到的)。

在下面的代碼中,行MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); 負責處理和移動showdialog後導致對象未找到操作,當用戶單擊對話框下屬性頁面內的任何項目。

public override MnemonicSelectorResult ShowMnemonicSelector(MnemonicSelectorSearchParameters parameters) 
{ 
    MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); 
    ResizeMnemonicSelectorIfNeeded(); 
    SetupMnemonicDialog(m_PropertyDialog, MnemonicSelector, MnemonicSelector.Title); 

    DialogResult dResult = ShowFakeDialog(m_PropertyDialog, MnemonicSelector.Title); 
    return MnemonicSelector.Result; 
} 
private void ResizeMnemonicSelectorIfNeeded() 
{ 
    if ((MnemonicSelector.ClientSize.Width < 909) || (MnemonicSelector.ClientSize.Height < 620)) 
     m_PropertyDialog.ClientSize = new System.Drawing.Size(939, 697); 
} 
protected void SetupMnemonicDialog(PropertiesDialogControl propertydialog, PropertyPage page, string title) 
{ 
    List<PropertyPage> pages = new List<PropertyPage>(); 
    pages.Insert(0, page); 
    PropertyPage[] propertyPages = pages.ToArray(); 

    if (title != null) 
     propertydialog.Text = title; 

    propertydialog.SetPropertyPages(new List<PropertyPage>(propertyPages)); 
} 
public virtual DialogResult ShowFakeDialog(Control contents, string title) 
{ 
    return ShowFakeDialog(contents, title, false, ""); 
} 

public DialogResult ShowFakeDialog(Control contents, string title, bool isCancelButtonVisible, string cancelButtonText) 
{ 
    FakeDialog fakeDialog = new FakeDialog(this, contents, title, isCancelButtonVisible, cancelButtonText); 
    using (fakeDialog) 
    { 
     lock (this) 
     { 
      FakeDialog previousFakeDialog = _activeFakeDialog; 
      _activeFakeDialog = fakeDialog; 

      try 
      { 
       return fakeDialog.ShowDialog(); 
      } 
      finally 
      { 
       _activeFakeDialog = previousFakeDialog; 
      } 
     } 
    } 
} 

請指點上我能實現所需的功能,其中,我可以顯示對話框,後來加載屬性頁(處理)。

+0

這是C#的問題嗎? – VMAtm

+5

顯示一個對話框不可用10秒對用戶沒有幫助。使用BackgroundWorker獲取數據,以便UI不會凍結。顯示一個litte「我正在處理它,而不是死」窗口,同時它在一個像marquee模式下的進度條一樣的動畫中運行。關閉該窗口並在RunWorkerCompleted事件處理程序中顯示對話框。 –

回答

0

您應該爲此使用後臺工作線程。檢查this。它應該有助於您使用後臺工作人員將您的進度動畫與處理邏輯分開。