ユニフォーム グリッドでレイアウトする必要があります。以下はレイアウトです
均一グリッドでは、2 番目の行のレイアウト アイテムは Right_to_Left から開始する必要があります (フロー方向は使用しません)。現在、Left_to_Right から開始しています
「Button1」を折りたたむと、レイアウトは次のようになります
誰でも私を助けてくれますか
ユニフォーム グリッドでレイアウトする必要があります。以下はレイアウトです
均一グリッドでは、2 番目の行のレイアウト アイテムは Right_to_Left から開始する必要があります (フロー方向は使用しません)。現在、Left_to_Right から開始しています
「Button1」を折りたたむと、レイアウトは次のようになります
誰でも私を助けてくれますか
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
この実装は現在、プロパティでは機能しません。オフにする必要がある場合は、それに対応するためにオーバーライドを微調整できます。