2010-02-23 6 views
4

탭의 오른쪽 가장자리에 닫기 X가있는 탭을 정확하게 칠할 수 있도록 사용자 지정 TabControl 위젯을 만들려고했습니다. 모든 탭을 보유하는 사용자 지정 배열 클래스가 있습니다.Control.ControlCollection을 재정의하는 올바른 방법

그래서 Reflect Serialization 중에 숨길 수 있도록 CreateControlsInstance 인스턴스 클래스를 재정 의하여 Controls 클래스를 다시 정의합니다.

protected override Control.ControlCollection CreateControlsInstance() { 
    return new ControlCollection(this); 
} 

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
private new Control.ControlCollection Controls { 
    get { return base.Controls; } 
} 

다음으로 재정의 클래스를 만듭니다.

public new class ControlCollection: Control.ControlCollection { 
    private xTabControl owner; 

    public ControlCollection(xTabControl owner): base(owner) { 
    this.owner = owner; 
    } 

    public override void Add(Control value) { 
    if (!(value is xTabPage)) 
     throw new Exception("The control must be of type xTabPage"); 

    xTabPage tabPage = (xTabPage)value; 

    if (!owner.inTabEvent) 
     owner._tabPages.Add(tabPage); 

    base.Add(value); 
    } 

    public override void Remove(Control value) { 
    if (!(value is xTabPage)) 
     throw new Exception("The control must be of type JDMX.Widget.xTabPage"); 

    if (!owner.inTabEvent) { 
     xTabPage tabPage = (xTabPage)value; 
     owner._tabPages.Remove(tabPage); 
    } 

    base.Remove(value); 
    } 

    public override void Clear() { 
    owner._tabPages.Clear(); 
    } 
} 

는 현재이 작동하지만 컨트롤 클래스는 여전히 기본 ArrayList에 있지만 tabPages 배열을 변경하는 등의 방법의되는 setChildIndex를 호출 할 수 있습니다.

xTabControl을 사용하여 새 xTabPage 객체를 등록 할 때 기본 클래스를 사용해야하는 새로운 ControlCollection 클래스가 필요 없게되고 싶습니다.

저는 이미 .Net Reflector를 사용하여 클래스 구조를 거쳤습니다. 나는 새로운 위젯의 등록을 얻으려면 Control 클래스의 절반을 복사 할 필요가 없기를 바란다.

나는 이것이 긴 발사임을 알고 있지만 누구든지이 일을 성공적으로 수행 했습니까?

+0

필자는 여러 가지 이유로 탭 크기를 제어 할 수없는 등의 이유로 WinForms 표준 TabControl (현재 3rd party 컨트롤 사용)을 사용자 지정하지 않았습니다. 그러나 관련성이있는 일부 리소스는 다음과 같습니다. http : // dotnetrix. co.uk/tabcontrol.htm ... http://www.codeproject.com/KB/dotnet/CustomTabControl.aspx ... http://www.codeproject.com/KB/tabs/flattabcontrol.aspx ... 이 코드 프로젝트 기사에 대한 의견에는 다른 링크와 많은 문제점이 있습니다. 행운을 빕니다 ! – BillW

답변

1

내 연구 전반에 걸쳐 Add 함수에 컨트롤 할당이 제공하는 함수의 수 때문에 System.Windows.Forms.Control.ControlCollection을 사용하지 않고 UserControls를 관리 할 수있는 인스턴스를 찾을 수 없습니다. 제가 Designer를 방정식에 통합하기 시작했을 때 더 나빴습니다. 그래서 위의 커스텀 오버라이드를 사용하여 Controls 속성을 채택하기로 결정했습니다. 이제는 개인 레벨 _tabPages를 Control Collection과 동기화해야하며 다른 방법은 사용하지 않아야합니다.

0

그럼 .net Reflector (decomplier)와 같은 것을 사용하여 .net에서 tabcontrol 클래스를 추출하고 해당 클래스를 편집 할 수 있습니다.

+0

나는 tabrefrol, tabpage 및 컨트롤 클래스를 통해 .net Reflector를 사용 해왔다. 나는 사용자 정의 탭 컨트롤 클래스를 작성해야만하는 이유는 기존 탭 컨트롤이 닫기 X에 필요한 추가 공간으로 탭을 올바르게 페인트하지 않기 때문입니다. 콤보 또는 목록 상자와 달리 true를 사용자 정의하기 위해 재정의 할 OnDrawItem은 없습니다. 탭 너비 – JDMX

+0

@jdmx :하지만 "OwnerDrawFixed"로 설정하고 "DrawItem"이벤트를 처리하여 사용자 정의 페인팅을 수행 할 수있는 "DrawMode"속성이 있습니다. 물론 재정의 할 수있는 OnDrawItem이 있습니다. –

+0

나는 이미 Windows TabControl보다 더 많은 기능을 가진 새로운 TabControl을 만드는 데 시간을 보냈다. 지금 내가 찾고있는 것은 ControlControlCollection을 사용하여 tabcontrol에 탭 패널을 등록하고 대신 작성한 TabControl.ControlCollection을 사용하지 않아도되는 방법입니다. – JDMX

관련 문제