2013-03-12 5 views
6

내 레이아웃 엔진을 사용하여 사용자 지정 Panel 컨트롤을 만들려고합니다. 코드 위레이아웃 엔진이있는 사용자 지정 패널

using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Layout; 

namespace VContainer 
{ 
    internal class VerticalFillList : Panel 
    { 
     public VerticalFillList() 
     { 
      AutoScroll = true; 
      MinimumSize = new Size(200, 200); 
      Size = new Size(200, 300); 
      Padding = new Padding(10); 
     } 

     private readonly VerticalFillLayout _layoutEngine = new VerticalFillLayout(); 

     public override LayoutEngine LayoutEngine 
     { 
      get { return _layoutEngine; } 
     } 

     private int _space = 10; 

     public int Space 
     { 
      get { return _space; } 
      set 
      { 
       _space = value; 
       Invalidate(); 
      } 
     } 
    } 

    internal class VerticalFillLayout : LayoutEngine 
    { 
     public override bool Layout(object container, LayoutEventArgs layoutEventArgs) 
     { 
      var parent = container as VerticalFillList; 

      Rectangle parentDisplayRectangle = parent.DisplayRectangle; 
      Point nextControlLocation = parentDisplayRectangle.Location; 

      foreach (Control c in parent.Controls) 
      { 
       if (!c.Visible) 
       { 
        continue; 
       } 

       c.Location = nextControlLocation; 
       c.Width = parentDisplayRectangle.Width; 
       nextControlLocation.Offset(0, c.Height + parent.Space); 
      } 
      return false; 
     } 
    } 
} 

잘 작동 : 아래 enter image description here

내 코드입니다 : 나는 다음과 같이 아래에 추가 할 수 및 전체 폭 (-padding) 걸릴 내 패널에 추가 할 때마다 컨트롤이 필요합니다 , 단 한가지 제외 : 컨테이너에 컨트롤을 추가 할 때 컨테이너가 올바르게 추가됩니다 (부모, 100 % 너비 이하).하지만 컨트롤 높이가 컨테이너 높이보다 클 때 가로 스크롤 막대가 표시되지만 몇 가지 컨트롤을 추가하면 더 많은 스크롤바가 제거됩니다. 이 resizing container

를 고정 할 수있는 방법 : 내 컨테이너의 크기를 조정하고자 할 때 adding components

똑같은 일이 일어날까요? 나는 그 수평 스크롤바를 제거 할 필요가있다.

는 물론 모든 개선 : 내가 필요로 할 때이 사람이 바로 저를주기 때문에 나는 테이블 레이아웃을 사용하거나 레이아웃 흐름 싶지 않아

환영합니다.

모든 하위 컨트롤을 위에서 아래로 순서대로 정렬하고 가로로 늘어서서 컨테이너의 가로 스크롤 막대가 필요하지 않도록 많은 너비를 차지하는 간단한 컨테이너가 필요합니다.

button1.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; 

그래서 그들은 여기

+0

을하지만, 그것은 당신이 영원히 뉴스 bottons를 넣어 수없는 고정 할 경우 ... O_O – MayogaX

+0

@MayogaX - 나는 그것을 안다 : 나는 단지 나의 요점을 보여주고 싶었다. 단추 대신 사용자 지정 컨트롤이 있습니다. 내 요점은 내 패널이 어떻게 행동하는지 보여 주려했다. 대부분의 경우 2-3 개의 컨트롤이 있지만 사용자가 새 컨트롤을 추가 할 때 가로 스크롤 막대가 보이면 상황을 피하기를 원합니다. 응용 프로그램의 크기를 조정하는 것과 동일한 상황입니다. 나는 거기에 5 ~ 6 개의 컨트롤을 들고있을거야. 위는 원하지 않는 동작을 보여주는 데모 일뿐입니다. – Misiu

+2

WinForm 디자이너가 LayoutEngine 클래스에서주의 깊게 밟은 문제를 해결하려고합니다. 이와 같은 레이아웃은 * 쌍 안정 *입니다. 이 문제를 해결하려는 가장 일반적인 결과는 수평 스크롤 막대가 깜박 거리면서 끝이없는 루프에 갇히게됩니다. 당신은 수업을 재발 명하고 같은 방식으로 그렇게 끝내게 될 운명입니다. –

답변

3

불행하게도, 당신의 레이아웃 엔진 클래스를 사용하지 않는 작업 예입니다 수평 크기를 조정할 수 있습니다 :

+0

레이아웃 엔진은 나를 위해 잘 작동하는 옵션 이었지만 스크롤바에 문제가있었습니다. 만약 당신의 솔루션이 그 문제를 해결한다면 그것은 나에게 완벽하다. :) – Misiu

+1

당신의 솔루션을 확인한 것은 매력처럼 작동한다. 유일한 것은 스크롤바를 제거하기 위해'LayoutControls'를 호출하는'OnControlRemoved'의 오버라이드이다. – Misiu

-1

당신은 같은 당신이 버튼에 AnchorProperty을 설정할 수 있습니다. 그것은 단순히 OnControlAdded 및 OnControlRemoved 방법에 의존하고, 고정 및 AutoScrollMinSize 속성을 설정하는 것은 특히 수평 스크롤이 결코 나타나지 확인 :

internal class VerticalPanel : Panel { 
    private int space = 10; 

    public int Space { 
    get { return space; } 
    set { 
     space = value; 
     LayoutControls(); 
    } 
    } 

    protected override void OnControlAdded(ControlEventArgs e) { 
    base.OnControlAdded(e); 
    LayoutControls(); 
    } 

    protected override void OnControlRemoved(ControlEventArgs e) { 
    base.OnControlRemoved(e); 
    LayoutControls(); 
    } 

    private void LayoutControls() { 
    int height = space; 
    foreach (Control c in base.Controls) { 
     height += c.Height + space; 
    } 
    base.AutoScrollMinSize = new Size(0, height); 

    int top = base.AutoScrollPosition.Y + space; 
    int width = base.ClientSize.Width - (space * 2); 
    foreach (Control c in base.Controls) { 
     c.SetBounds(space, top, width, c.Height); 
     c.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; 
     top += c.Height + space; 
    } 
    } 
} 
+0

버튼에 앵커가 필요하지 않습니다. 레이아웃 엔진이 컨테이너의 모든 구성 요소의 위치를 ​​처리하기 때문입니다. 내 사용자 정의 패널 내의 버튼의 크기가 올바르게 조정됩니다. 수평 스크롤바를 제거하는 것은 때로는 표시되기 때문에해야합니다. – Misiu

관련 문제