たとえば、 を実装しTwoColumnStackPanel
ます。名前が示すように、ジェネラルStackPanel
は要素を 1 列にしかスタックできませんが、TwoColumnStackPanel は要素を 2 列にスタックできます。
TwoColumnStackPanel は、要素を 2 つの列に均等に分散する必要があります。4 つの要素の場合、左 2 と右 2。左 2 と右 3 の 5 つの要素。
TwoColumnStackPanel は実際には 2 つの横に並んだ StackPanel であり、既存の StackPanel を使用して実装できると思いますか?
class TwoColumnStackPanel : Panel
{
private readonly StackPanel leftPanel;
private readonly StackPanel rightPanel;
public TwoColumnStackPanel()
{
leftPanel = new StackPanel();
rightPanel = new StackPanel();
}
protected override Size MeasureOverride(Size availableSize)
{
int size = InternalChildren.Count;
int leftCount = size / 2;
int rightCount = size - leftCount;
//Load elements to left stackpanel.
int index = 0;
leftPanel.Children.Clear();
for (int s = 0; s < leftCount; s++)
{
leftPanel.Children.Add(InternalChildren[index + s]);
}
//Load elements to right stackpanel.
index += leftCount;
rightPanel.Children.Clear();
for (int s = 0; s < rightCount; s++)
{
rightPanel.Children.Add(InternalChildren[index + s]);//error
}
//Measure the two stackpanel and the sum is my desired size.
double columnWidth = availableSize.Width / 2;
leftPanel.Measure(new Size(columnWidth, availableSize.Height));
rightPanel.Measure(new Size(columnWidth, availableSize.Height));
return new Size(leftPanel.DesiredSize.Width + rightPanel.DesiredSize.Width, Math.Max(leftPanel.DesiredSize.Height, rightPanel.DesiredSize.Height));
}
protected override Size ArrangeOverride(Size finalSize)
{
leftPanel.Arrange(new Rect(0,0,leftPanel.DesiredSize.Width,leftPanel.DesiredSize.Height));
rightPanel.Arrange(new Rect(leftPanel.DesiredSize.Width,0,rightPanel.DesiredSize.Width,rightPanel.DesiredSize.Height));
return finalSize;
}
}
上記のコードは、ラベル行で例外をスローします。修正方法は?正しい方法で実装していますか?