1

画像を参照してください コントロールの各行の間の水平方向のスペースを減らしたいと思います。

この Windows は FlowLayoutPanel を形成します。現在の間隔を示すために、1 つのセルを赤で強調表示しました。

ここに画像の説明を入力

4

1 に答える 1

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 メソッドは少し急ぎ足でハッキングされているように見えますが、もっとうまくできるはずです。

于 2012-09-13T09:19:41.287 に答える