2011-09-21 2 views
2

나는 tabpage 사용자 정의 컨트롤과 동적으로 할당 된 tabpage 사용자 정의 컨트롤에 대한 3 개의 속성 페이지가 있습니다. 이 탭 컨트롤은 대화 상자 안에 표시됩니다.Windows 대화 상자를 표시 한 후 처리하는 방법은 무엇입니까?

탭 페이지 컨트롤에 대한 데이터 처리 및 필터링에 더 많은 시간이 소요되고 이로 인해 대화 상자를 열기 전에 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; 
      } 
     } 
    } 
} 

내가 대화 상자를 표시하고 나중에 속성 페이지 (처리를)로드 할 수있어서, 원하는 기능을 달성 할 수있는 I에에 조언을 주시기 바랍니다.

+0

이 질문이 궁금하십니까? – VMAtm

+5

10 초 동안 사용할 수없는 대화 상자를 표시하는 것은 사용자에게 도움이되지 않습니다. UI가 고정되지 않도록하려면 BackgroundWorker를 사용하여 데이터를 가져옵니다. marquee 모드에서 진행률 막대와 같은 애니메이션으로 실행되는 동안 litte "나는 죽은 상태가 아닌"윈도우를 표시합니다. 해당 창을 닫고 대화 상자를 RunWorkerCompleted 이벤트 처리기에 표시하십시오. –

답변

0

이 경우 백그라운드 작업자 스레드를 사용해야합니다. this을 확인하십시오. 백그라운드 워커를 사용하여 진행 논리를 처리 로직과 분리하는 데 도움이됩니다.

관련 문제