2012-09-13 3 views
1

이미지보기 컨트롤의 각 행 사이에 공간을 수평으로 줄이려고합니다.FlowLayoutPanel의 가로 공간 줄이기

이 Windows는 FlowLayoutPanel을 형성합니다. 현재 간격을 표시하기 위해 빨간색으로 하나의 셀을 강조 표시했습니다.

enter image description here

답변

1

당신은 아주 쉽게 당신이 패널에서 파생하여 사용자 지정 FlowLayoutPanel을 소유 만들 수 있습니다.

아래 코드는 가로 및 세로 모두 일정한 경계선을 설정하고 있지만 지평선 및 수직 간격에 대해 각각 속성을 갖도록 쉽게 수정할 수 있습니다.

public class FlowPanel : Panel 
{ 
    protected int _TileBorder; 
    public int TileBorder 
    { 
     get 
     { 
      return this._TileBorder; 
     } 
     set 
     { 
      this._TileBorder = value; 
      this.RearrangeControls(this, this.TileBorder); 
     } 
    } 
    public FlowPanel() 
    { 
     this.AutoScroll = true; 
    } 
    public FlowPanel(int tileBorder) 
    { 
     this.AutoScroll = true; 
     this.TileBorder = tileBorder; 
    } 
    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     this.RearrangeControls(this, this.TileBorder); 
    } 
    protected override void OnControlAdded(ControlEventArgs e) 
    { 
     base.OnControlAdded(e); 
     this.RearrangeControls(this, this.TileBorder); 
     e.Control.SizeChanged += new EventHandler(this.Control_SizeChanged); 
    } 
    protected override void OnControlRemoved(ControlEventArgs e) 
    { 
     base.OnControlRemoved(e); 
     this.RearrangeControls(this, this.TileBorder); 
     e.Control.SizeChanged -= new EventHandler(this.Control_SizeChanged); 
    } 
    protected void RearrangeControls(Panel p, int border) 
    { 
     int num = border; 
     int num2 = border; 
     int num3 = 0; 
     bool flag = true; 
     foreach (Control control in p.Controls) 
     { 
      if (control != null) 
      { 
       num3 = ((control.Height > num3) ? control.Height : num3); 
       if (flag) 
       { 
        num += control.Width + border; 
        control.Location = new Point(border, border); 
        flag = false; 
       } 
       else 
       { 
        if (num + control.Width + 2 * border > p.Width) 
        { 
         num2 += num3 + border; 
         control.Location = new Point(border, num2); 
         num = border + (control.Width + border); 
         num3 = control.Height; 
        } 
        else 
        { 
         control.Location = new Point(num, num2); 
         num += control.Width + border; 
        } 
       } 
      } 
     } 
    } 
    private void Control_SizeChanged(object sender, EventArgs e) 
    { 
     this.RearrangeControls(this, this.TileBorder); 
    } 
} 

지금 내가 보는 것으로는 RearrangeControls 방법은 지금 나에게 약간 해킹 - 함께 - 인 - 어 - 서둘러 보이지 않는,하지만 난 당신이 더 좋은 만들 수있는 확신합니다!

+0

기본 높이가 설정된 내부 패널에 문제가있었습니다. – Malcolm