1

ユニフォーム グリッドでレイアウトする必要があります。以下はレイアウトです

均一レイアウト

均一グリッドでは、2 番目の行のレイアウト アイテムは Right_to_Left から開始する必要があります (フロー方向は使用しません)。現在、Left_to_Right から開始しています

「Button1」を折りたたむと、レイアウトは次のようになります

折りたたみボタン1

誰でも私を助けてくれますか

4

1 に答える 1

2

ArrangeOverride(...)で微調整することでこれを行うことができると思いますUniformGrid

サンプルだけをお探しの場合は、デモをダウンロードできます ->ここ

まず、 Hereから垂直方向 (列方向) に要素をレイアウトする例を見つけました。

ArrangeOverride(...)したがって、そのソリューションを使用すると、次のように更新できます。

protected override Size ArrangeOverride(Size arrangeSize) {
  var finalRect = new Rect(0.0, 0.0, arrangeSize.Width / _columns, arrangeSize.Height / _rows);
  Double width = finalRect.Width;
  Double maxWidth = arrangeSize.Width;
  finalRect.X += finalRect.Width * FirstColumn;
  int currentRow = 1;
  foreach (UIElement element in InternalChildren) {
    element.Arrange(finalRect);
    if (element.Visibility == Visibility.Collapsed)
      continue;
    if (currentRow % 2 == 0) {
      finalRect.X -= width;
      if (finalRect.X <= -width) {
        ++currentRow;
        finalRect.Y += finalRect.Height;
        finalRect.X = 0;
      }
    } else {
      finalRect.X += width;
      if (finalRect.X >= maxWidth) {
        ++currentRow;
        finalRect.Y += finalRect.Height;
        finalRect.X = maxWidth - width;
      }
    }
  }
  return arrangeSize;
}

ロジック:foreach(...)要素の現在の行と 1 つおきの行を確認する 内部で、 X オフセットを適宜変更して水平方向を切り替えます。

これにより、探している動作が得られます。

msdn リンクが将来なくなる場合に備えて、完全な派生クラス コードを次に示します。

public class MyUniformGrid : UniformGrid {
  private int _columns;
  private int _rows;

  protected override Size MeasureOverride(Size constraint) {
    UpdateComputedValues();
    var availableSize = new Size(constraint.Width / (_columns), constraint.Height / (_rows));
    double width = 0.0;
    double height = 0.0;
    int num3 = 0;
    int count = base.InternalChildren.Count;
    while (num3 < count) {
      UIElement element = base.InternalChildren[num3];
      element.Measure(availableSize);
      Size desiredSize = element.DesiredSize;
      if (width < desiredSize.Width) {
        width = desiredSize.Width;
      }
      if (height < desiredSize.Height) {
        height = desiredSize.Height;
      }
      num3++;
    }
    return new Size(width * _columns, height * _rows);
  }

  private void UpdateComputedValues() {
    _columns = Columns;
    _rows = Rows;
    if (FirstColumn >= _columns) {
      FirstColumn = 0;
    }

    if (FirstColumn > 0)
      throw new NotImplementedException("There is no support for seting the FirstColumn (nor the FirstRow).");
    if ((_rows == 0) || (_columns == 0)) {
      int num = 0; // Visible children  
      int num2 = 0;
      int count = base.InternalChildren.Count;
      while (num2 < count) {
        UIElement element = base.InternalChildren[num2];
        if (element.Visibility != Visibility.Collapsed) {
          num++;
        }
        num2++;
      }
      if (num == 0) {
        num = 1;
      }
      if (_rows == 0) {
        if (_columns > 0) {
          _rows = ((num + FirstColumn) + (_columns - 1)) / _columns;
        } else {
          _rows = (int)Math.Sqrt(num);
          if ((_rows * _rows) < num) {
            _rows++;
          }
          _columns = _rows;
        }
      } else if (_columns == 0) {
        _columns = (num + (_rows - 1)) / _rows;
      }
    }
  }

  protected override Size ArrangeOverride(Size arrangeSize) {
    var finalRect = new Rect(0.0, 0.0, arrangeSize.Width / _columns, arrangeSize.Height / _rows);
    Double width = finalRect.Width;
    Double maxWidth = arrangeSize.Width;
    finalRect.X += finalRect.Width * FirstColumn;
    int currentRow = 1;
    foreach (UIElement element in InternalChildren) {
      element.Arrange(finalRect);
      if (element.Visibility == Visibility.Collapsed)
        continue;
      if (currentRow % 2 == 0) {
        finalRect.X -= width;
        if (finalRect.X <= -width) {
          ++currentRow;
          finalRect.Y += finalRect.Height;
          finalRect.X = 0;
        }
      } else {
        finalRect.X += width;
        if (finalRect.X >= maxWidth) {
          ++currentRow;
          finalRect.Y += finalRect.Height;
          finalRect.X = maxWidth - width;
        }
      }
    }
    return arrangeSize;
  }
}

ノート:

UniformGrid.FirstColumnこの実装は現在、プロパティでは機能しません。オフにする必要がある場合は、それに対応するためにオーバーライドを微調整できます。

于 2013-06-18T10:13:50.190 に答える