8

独自のレイアウトエンジンを使用してカスタムパネルコントロールを作成しようとしています。パネルに追加されたすべてのコントロールを下に追加し、以下のように全幅(-padding)にする必要があります。 ここに画像の説明を入力してください

以下は私のコードです:

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;
        }
    }
}

上記のコードは、1つを除いて正常に機能します。コンテナにコントロールを追加すると、正しく追加されます(親の下に新しく、幅100%)が、コントロールの高さがコンテナの高さよりも大きい場合は、水平スクロールバーが表示されます。カップルコントロールを追加すると、スクロールバーが削除されます。 コンポーネントの追加

コンテナのサイズを変更したい場合も同じことが起こります。 コンテナのサイズ変更

これはどのように修正できますか?その水平スクロールバーを削除する必要があります。

もちろん、すべての改善は大歓迎です:)

テーブルレイアウトやフローレイアウトは、必要なときに正確に表示されるため、使用したくありません。

すべての子コントロールを上から下に並べて水平方向に伸ばすシンプルなコンテナーが必要です。これにより、コンテナーの水平スクロールバーが不要になります。

4

2 に答える 2

6

残念ながら、レイアウトエンジンクラスを使用しない実際の例を次に示します。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;
    }
  }
}
于 2013-03-12T16:57:23.530 に答える
-1

次のようなボタンでAnchorPropertyを設定できます。

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

そのため、水平方向にサイズ変更されます

于 2013-03-12T11:41:47.123 に答える