0

だから私は垂直に包まれたラップパネルを持っています。アイテムは実行時に追加されますが、これらのアイテム(ユーザーコントロール)はすべて幅が異なり、ラップパネルは垂直方向に折り返されるため、下に積み重ねられ、垂直方向のスペースをカバーすると次の列に折り返されます。しかし、必要なのは「一種の」双方向ラッピングです。つまり、幅200pxの最初のアイテムを追加し、次に幅50pxのような2番目のアイテムを追加しましたが、100pxのような3番目のアイテムを追加するとwidth次の行に移動しないようにしますが、上部の200pxコントロールに応じて、そこに残っている50pxコントロールをその空き領域に配置します(150pxのスペースが残り、100pxのコントロールが明確に収まります)。もちろん、収まらない場合は次の行に折り返されますが、それで問題ありません。

これを明確にするための画像は次のとおりです(ここにアップロードできません):

それが起こることです: 画像1

そしてそれが私が欲しいものです: 画像2


私の英語は申し訳ありませんが、それは私の第一言語ではありません。私の質問をご理解いただければ幸いです。

4

2 に答える 2

0

単一のパネルを使用してそれを達成することは絶対にできません! 必要な「列」動作を行うために、水平方向の複数の動的ラップパネルを挿入するスタックパネルを使用できます

于 2011-10-02T10:23:51.873 に答える
0

さて、私はやった。私が望んでいた動作を備えたカスタムラッパーパネルを作成しました。

ここにあります:

public class TwoWayWrapPanel : Panel
{
int _rowCount = 0;

public int RowCount
{
    get { return _rowCount; }
    set { _rowCount = value; }
}

protected override Size MeasureOverride(Size availableSize)
{
    Size resultSize = new Size(0, 0);
    double columnWidth = 0;
    double usedSpace = 0;
    double nullX = 0;
    double currentX = 0;
    double currentY = 0;
    bool isFirst = true;
    int row = 0;

    foreach (UIElement child in Children)
    {
        child.Measure(availableSize);

        if (isFirst)
        {
            columnWidth = child.DesiredSize.Width;
            resultSize.Width += columnWidth;
            currentY += child.DesiredSize.Height;
            row++;
            isFirst = false;
        }
        else
        {
            if (columnWidth >= usedSpace + child.DesiredSize.Width & _rowCount > 1)
            {
                currentX = nullX + usedSpace;
                usedSpace += child.DesiredSize.Width;
            }
            else
            {
                row++;

                if (row + 1 > _rowCount | child.DesiredSize.Width > columnWidth)
                {
                    row = 0;
                    currentX = nullX + columnWidth;
                    nullX = currentX;
                    usedSpace = 0;
                    columnWidth = child.DesiredSize.Width;
                    currentY = child.DesiredSize.Height;
                    row++;
                    resultSize.Width += columnWidth;
                }
                else
                {
                    currentY += child.DesiredSize.Height;
                    currentX = nullX;
                    usedSpace = child.DesiredSize.Width;
                }
            }
        }
    }

    return resultSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
    double columnWidth = 0;
    double usedSpace = 0;
    double nullX = 0;
    double currentX = 0;
    double currentY = 0;
    bool isFirst = true;
    int row = 0;

    foreach (UIElement child in Children)
    {
        //First item in the collection
        if (isFirst)
        { 
            child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height));
            columnWidth = child.DesiredSize.Width;
            currentY += child.DesiredSize.Height;
            row++;
            isFirst = false;
        }
        else
        {
            //Current item fits so place it in the same row
            if (columnWidth >= usedSpace + child.DesiredSize.Width & _rowCount > 1)
            {
                currentX = nullX + usedSpace;
                child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height));
                usedSpace += child.DesiredSize.Width;
            }
            else
            {
                row++;

                //The row limit is reached or the item width is greater than primary item width. Creating new column
                if (row + 1 > _rowCount | child.DesiredSize.Width > columnWidth)
                {
                    row = 0;
                    currentY = 0;
                    currentX = nullX + columnWidth;
                    nullX = currentX;
                    usedSpace = 0;
                    child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height));
                    columnWidth = child.DesiredSize.Width;
                    currentY += child.DesiredSize.Height;
                    row++;
                }
                //Item doesn't fit. Adding to the new row in the same column
                else
                {
                    usedSpace = 0;
                    currentY += child.DesiredSize.Height;
                    currentX = nullX;
                    child.Arrange(new Rect(currentX, currentY, child.DesiredSize.Width, child.DesiredSize.Height));
                    usedSpace += child.DesiredSize.Width;
                }
            }
        }
    }

    return finalSize;
}
}
于 2011-10-02T18:57:01.680 に答える