2013-11-28 6 views
0

Panel로드로 Form을 만들었습니다. 동적으로 생성 된 컨트롤을 표시 할 준비가 될 때까지이 로딩 패널을 표시하려고합니다.Controls 컬렉션에 동적으로 추가 할 때 winforms 컨트롤이 표시되지 않도록하기

처음에는로드 Panel이 표시되고 나서 OnShown 이벤트 중에 컨트롤을 만들고이를 페이지에 추가하고 있습니다. 내가 OnShown을 사용하는 이유는 Form이 Mdi 시나리오에서 사용되고 있으므로 컨트롤을로드하기 전에 완전히 표시해야합니다 (Load 이벤트에서이 이벤트를 시도하면 Mdi 탭이 표시되지 않습니다. 컨트롤이로드 됨).

A) Visible 속성을 즉시 true로 설정 :

문제는 내가 때문에 나는 Controls 컬렉션에 내 컨트롤을 추가 할 때 사실이라고 생각 눈에 띄는 플리커가 있다는 것입니다. b) Z- 인덱스가 올바른 것처럼 보일지라도 로딩 패널 앞에 내 컨트롤이 나타나는 것 같습니다. 여기

내가 컬렉션에 내 컨트롤을 추가 할 수 있습니다 내 컨트롤의 Load 이벤트가 완료했을 때 나는 Visible = true을 설정할 수 있도록이 Visible = false 남아 것이라고 기대했다 문제

protected override void OnShown(EventArgs e) 
    { 
     Debug.WriteLine(loadingPanel.Visible); //true 
     Debug.WriteLine(Controls.GetChildIndex(loadingPanel)); //0 

     Debug.WriteLine(myControl.Visible); //false 

     myControl.Visible = false; 
     Controls.Add(myControl); 
     //** 

     Debug.WriteLine(myControl.Visible); //true 

     Debug.WriteLine(Controls.GetChildIndex(loadingPanel)); //0 
     Debug.WriteLine(Controls.GetChildIndex(myControl)); //1 

     Debug.WriteLine(loadingPanel.Visible); //true 

     base.OnShown(e); 
    } 

의 덩어리입니다. 대신, 내 컨트롤을 볼 수있게되고 깜박입니다. 흥미롭게도, 어느 시점에서 loadingPanel.Visible = false을 설정하지 않으면 컨트롤이로드를 완료하면 loadingPanel이 다시 나타나고 컨트롤을 숨 깁니다.

아이디어가 있으십니까?

+0

추가가 완료 될 때까지 페인트 작업을 건너 뛰고 페인트 메서드를 무시하고 'OnShown' 메서드에서 플래그를 설정할 수 있습니다. 어둠 속에서 찌르기 만! – Charleh

+0

@Charleh는 좀 더 정교하게 만들 수 있습니까? 시도할만한 가치가있는 것 같습니다.아마도 대답으로? – OffHeGoes

답변

0

은 다소 이상하게도,이 내 문제를 해결하기 위해 관리하는 방법입니다 명백한. 컬렉션에 추가하기 전에 표시되도록 설정하면 부모 컨트롤에 영향을주지 않아도 관련 핸들이 만들어집니다. 나중에 컬렉션에 추가 될 때 여전히 상위 컨트롤을 방해하지 않습니다.

0

나는 당신의 mycontrol 표준 winforms 컨트롤을 가져 가니? 원하는 mycontrol을 가진 사용자 지정 컨트롤을 만들고 그 사용자 지정 컨트롤에서 "자식"컨트롤의 visible 속성을 false로 설정하는 것이 어떻습니까?

테스트하지 않았지만 다음에 할 일이 ...?

+0

죄송합니다. 제 컨트롤이 사용자 지정 UserControl이라고 말했어야합니다. Controls.Add는 컨트롤의 Visible 속성을 true로 설정하므로 제안 사항이 변경되지 않을 것이라고 생각합니다. – OffHeGoes

+0

그래,하지만 "child"컨트롤을 visible = false로 기본 설정 하시겠습니까? 로드되기 전에 만 visible = false를 "설정"하지 마십시오. 자식 컨트롤을 기본적으로 false로 설정합니까? 나중에 visible = true로 설정하십시오. –

0

false으로 설정 한 경우에도이를 다시 표시 할 필요가 없습니다. 다시 표시하면 컨트롤 수가 많으면 여전히 깜박입니다. 당신은 OnLoad 메소드를 오버라이드 (override) 해,이 같은 SuspendLayoutResumeLayout을 사용해야합니다

//Start adding controls 
SuspendLayout(); 
//.... 

//in the OnLoad 
protected override void OnLoad(EventArgs e){ 
    ResumeLayout(true); 
} 

나는 추가 컨트롤을 마무리하는 것이 확인 될 수있다 직후 ResumeLayout(true)를 사용하여, 당신은 또한 시도해야한다고 의심한다.

protected override void OnShown(EventArgs e) 
{ 
    //trigger the OnLoad event of myControl - this does NOT cause it to appear 
    //over the loading Panel 
    myControl.Visible = true; 
    myControl.Visible = false; //set it back to hidden 

    //now add the control to the Controls collection - this now does NOT trigger the 
    //change to Visible, therefore leaving it hidden 
    Controls.Add(myControl); 

    //finally, set it to Visible to actually show it 
    myControl.Visible = true; 

    base.OnShown(e); 
} 

난 단지 그 컨트롤 컬렉션에 컨트롤을 추가 할 때 핸들이 자동으로 설정됩니다 생성되지 않은 경우 가정 할 수 있습니다