2011-08-11 3 views
2

Windows Forms에서 비동기 UI를 쉽게 만들 수 있어야합니다. 거기에 다른 컨트롤을 호스팅 할 수있는 사용자 지정 컨테이너 컨트롤을 만드는 방법에 대해 생각하고있어. 그런 다음 응용 프로그램을 실행할 때 다른 컨트롤을 채우거나 초기화하지 않으면이 컨트롤에 진행률 막대가 표시됩니다. 그런 다음 작업이 완료되면 이러한 컨트롤이 표시되고 진행률 표시 줄이 숨겨집니다.비동기 제어 래퍼를 만드는 방법은 무엇입니까?

이 기능을 구현하는 방법에 대한 조언이 있으십니까?

+0

당신이하려는 일에 대해 더 자세한 정보를 제공해야합니다. – agibalov

답변

2

시작 지점으로 Panel 클래스를 사용할 수 있습니다. 그냥 그걸 상속 해.

진행률 표시 줄을 패널 상단이나 첫 번째 멤버로로드 할 수 있습니다. 업데이트하지 않으려면 진행률 표시 줄에서 선택 윤곽 스타일을 사용할 수 있습니다. 그렇지 않으면 패널에 컨트롤을 추가 할 때 진행률 막대를 증가시킬 수 있습니다.

마키 스타일을 사용하면 거의 완료됩니다. 실제 진행률 막대가 0에서 100 %까지 채워지 길 원한다면 약간의 허구가 필요합니다.

다음은 까다로운 부분입니다. UI 구성 요소 업데이트는 UI 스레드에서 실행해야합니다. UI 스레드는 컨트롤 추가가 완료 될 때까지 이벤트 (예 : 진행률 막대 업데이트)를 처리하지 않으므로 UI ​​스레드에서 모든 것을 실행할 수는 없습니다.

필요한 기능은 UI를 업데이트 할 수 있도록 패널에 컨트롤을 추가하는 방법입니다. 이를 수행 할 수있는 많은 방법이 있습니다.

Thread thread = new Thread(MyControlAddingMethod); 
thread.Start(); 

귀하의 제어 추가하는 방법은 UI 방법은 UI 스레드까지 호출을 마샬링해야합니다 : 가장 쉬운 방법은 할 틀림없이. 방법은 다음과 같습니다.

void MyControlAddingMethod() 
{ 
    myPanel.BeginInvoke(m => { myPanel.Controls.Add(myControl); ++myProgressBar.Value;}); 
    //or 
    myPanel.BeginInvoke(MyFunctionThatDoesTheSameAsTheLambdaStatementAbove); 
} 
+0

고마워, 그게 다야! – agibalov

관련 문제