ここでこの質問を見つけました:2次元配列に基づいてWPFグリッドを作成する方法と、マークされたソリューションを使用したかった. また、非常にうまく機能しているように見えますが、問題が 1 つあります。その問題は、楕円を使用してデータを表示していることです。したがって、すべてのアイテムが 1 つの楕円に相当します。
ここに問題があります: 楕円は Measure で x = 0、y = 0 のサイズのみを要求しています。したがって、私の問題は何も表示されないことです。そこで、カスタム Stackpanel を作成しようとしました。
public class StretchStackPanel : StackPanel
{
protected override Size MeasureOverride(Size constraint)
{
Size result = constraint;
result.Width = result.Width == Double.PositiveInfinity ? Double.MaxValue : result.Width;
result.Height = result.Height == Double.PositiveInfinity ? Double.MaxValue : result.Height;
if (this.Orientation == System.Windows.Controls.Orientation.Horizontal)
result.Height = result.Width / InternalChildren.Count;
return result;
}
protected override Size ArrangeOverride(Size arrangeSize)
{
var size = base.ArrangeOverride(arrangeSize);
double elementLength;
if (Orientation == System.Windows.Controls.Orientation.Horizontal)
elementLength = size.Width / InternalChildren.Count;
else
elementLength = size.Height / InternalChildren.Count;
double current = 0;
foreach (UIElement e in InternalChildren)
{
Rect result;
if (Orientation == System.Windows.Controls.Orientation.Horizontal)
{
result = new Rect(current, 0, elementLength, size.Height);
current += result.Width;
}
else
{
result = new Rect(0, current, size.Width, elementLength);
current += result.Height;
}
e.Arrange(result);
}
return size;
}
}
しかし、非常に奇妙な動作があります。アイテムの間には非常に小さなマージンがあり、ランダムに見えます。サイズを変更すると、それらが動いているのがわかります。
2 つのスクリーンショットを次に示します。
また、Stackpanel の代わりに列のみの Uniformgrid を使用し、Items コントロールの周りに ViewBox を使用して固定高さの itemstyle を設定しようとしました。