.NET Framework / C# / Windows フォーム
内部のコントロールの数に応じて、FlowLayoutPanel の幅または高さを自動的に調整したいと思います。十分なスペースがない場合は、列/行の数も変更する必要があります (コンテンツをラップします)。問題は、オートサイズを設定すると、フローレイアウトパネルが挿入したコントロールをラップしないことです。どのソリューションが最適ですか?
ありがとう!
.NET Framework / C# / Windows フォーム
内部のコントロールの数に応じて、FlowLayoutPanel の幅または高さを自動的に調整したいと思います。十分なスペースがない場合は、列/行の数も変更する必要があります (コンテンツをラップします)。問題は、オートサイズを設定すると、フローレイアウトパネルが挿入したコントロールをラップしないことです。どのソリューションが最適ですか?
ありがとう!
FlowLayoutPanel の MaximumSize を、折り返したい幅に設定します。WrapContents = true に設定します。
ソフトウェア開発に不可能などない。不可能はもっと時間がかかります。
問題を調査しました。Flow Layout が本当に必要な場合は、少し手を加えるだけで実現できます。FlowLayoutPanel は行/列の数を特に考慮せずにコントロールをレイアウトするため、幅/高さの累積を考慮して、既に追加したコントロールの数を追跡する必要がある場合があります。まず、autosize を false に設定してから、独自のサイズ管理ロジックを ControlAdded/ControlRemoved イベントにフックします。アイデアは、パネルの幅と高さを、目的の数の「列」が得られるように設定することです
汚い概念実証:
private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e)
{
int count = this.flowLayoutPanel1.Controls.Count;
if (count % 4 == 0)
{
this.flowLayoutPanel1.Height = this.flowLayoutPanel1.Height + 70;
}
}
パネルの最初の幅が 4 つのコントロールの場合、新しいコントロールの行が生成されます。ControlRemoved ハンドラーは、同じことを確認してパネルの高さを減らすか、含まれているすべてのコントロールを取得して再度配置する必要があります。あなたはそれについて考えるべきです、それはあなたが望むようなものではないかもしれません. 使用シーンにより異なります。すべてのコントロールは同じサイズになりますか? そうでない場合は、より複雑なロジックが必要になります。
しかし実際には、テーブル レイアウトについて考えてみてください。テーブル レイアウトをヘルパー クラスでラップするか、そこから新しいコントロールを派生させて、ロジックを配置するすべてのコントロールを解決することができます。FlowLayout を使用すると、コントロールを簡単に追加および削除できますが、サイズ管理コードが入ります。TableLayout を使用すると、行と列の優れたメカニズムが提供され、幅と高さの管理が簡単になりますが、すべての配置を変更するにはさらにコードが必要になります。フォームから動的に削除するかどうかを制御します。
可能であれば、使用可能なすべての幅を利用できるように FlowLayoutPanel のサイズを変更し、上、左、右に固定することをお勧めします。これにより、コントロールをラップしながら、必要に応じて高さが大きくなります。
これが古いスレッドであることは知っていますが、他の誰かがここで不思議に思っている場合は、私が作成したソリューションを次に示します。パネルで autosize を true に設定し、フロー パネルの Resize イベントからこの拡張メソッドを呼び出します。
public static void ReOrganise(this FlowLayoutPanel panel)
{
var width = 0;
Control prevChildCtrl = null;
panel.SuspendLayout();
//Clear flow breaks
foreach (Control childCtrl in panel.Controls)
{
panel.SetFlowBreak(childCtrl, false);
}
foreach (Control childCtrl in panel.Controls)
{
width = width + childCtrl.Width;
if(width > panel.Width && prevChildCtrl != null)
{
panel.SetFlowBreak(prevChildCtrl, true);
width = childCtrl.Width;
}
prevChildCtrl = childCtrl;
}
panel.ResumeLayout();
}
TableLayoutPanel を使用してみましたか? セル内にコントロールを配置するのに非常に便利です。
ユーザーのアクションに基づいて動的にコントロールを追加していますか?新しいコントロールを追加するときに、コード内でFlowLayoutプロパティをその場で変更する必要があるのではないかと思います。その後、フォームを更新するとうまくいきます。