2010-03-10 3 views
1

UI에 데이터를 표시하기 위해 다시 사용할 컨트롤 컬렉션이 포함 된 사용자 정의 컨트롤이 있습니다. 폼 (예 : Panel)의 다른 컨테이너에서 컨트롤을 다시 부모로 만들고, 새 탭 페이지를 만든 다음 컨트롤을 탭 페이지에 추가하는 "팝 아웃"옵션을 구현하려고했습니다.TabPage로 다시 태어난 컨트롤을 어떻게 수정합니까?

컨트롤이 TabPage에 추가되면 크기가 마지막 부모와 함께 고정 된 것처럼 보입니다.

컨트롤이 실제로 TabPage에 추가 된시기를 감지하기 위해 ParentChanged 이벤트를 오버로드했습니다. 크기를 검사하고 크기를 TabPage의 ClientRectangle로 설정 한 다음 크기를 다시 확인하려고 시도하면 변경되지 않습니다. Dock 속성을 설정해도이 동작 (특히 Fill)은 변경되지 않습니다.

protected override void OnParentChanged(EventArgs e) 
{ 
    if (this.Parent != null) 
    { 
     Size oldSize = this.Size; 

     this.Size = this.Parent.ClientRectangle.Size; 

     if (this.Size == oldSize) 
     { 
      // this is where we end up 
      throw new Exception("We didn't change size!"); 
     } 
    } 
} 

답변

0

컨트롤은 컨테이너 컨트롤에 처음 추가되었습니다. 리플렉터 (Reflector)를 통해 컨테이너 코드의 내부로 들어가면, 내 컨트롤의 최소/최대 크기 값을 다시 설정합니다. 부정확하게 기본 최소/최대 설정이 디자이너의 기본값으로 남아 있다고 가정했습니다. 콘테이너 컨트롤은 불행하게도 다르게 결정되었습니다. 가,가, 반사경! 물론이 동작은 문서화되지 않았습니다.

도움 주셔서 감사합니다.

0

컨트롤을 Dock으로 설정하면 크기/위치 변경 시도가 무시되는 것 같습니다. 개인적으로 Dock/Anchor/AutoSize 동작을 해제하고 컨트롤의 위치와 크기를 수동으로 설정합니다. 나는 이런 유형의 일을 많이했고 전혀 문제가 없었기 때문에 자동 레이아웃 옵션과 겨루고 있다고 생각합니다.

Dock에서 작업을 수행하려면 레이아웃을 다시 계산하기 위해 탭을 걷어차 야 할 수도 있습니다. (이 작업을 수행 할 수있는 Control.LayoutEngine 개체가 있지만 여기에서 조사 할 수있는 가능한 방법을 가정하고 있습니다 - 직접 시도하지 않았습니다.)

몇 가지 아이디어가 있지만, 어쨌든 ...