グリッドの列/行定義で SharedSizeGroup に似たものを実装しようとしています。
単純化されたケース:
<l:MyCustomPanel>
<l:MyCustomPanel>
<TextBlock l:MyCustomPanel.SharedWidth="t1" />
</l:MyCustomPanel>
<l:MyCustomPanel>
<TextBlock l:MyCustomPanel.SharedWidth="t1" />
</l:MyCustomPanel>
</l:MyCustomPanel>
root-panel がスコープを定義しています。同じ SharedWidth を持つすべての要素は、同じ幅を持つ必要があります。カスタムの Measure および Arrange 動作を実装しましたが、SharedSize モデルで動作させるのに苦労しています。どういうわけか、アレンジプロセスを2回パスする必要があると思いますか? 最初に default-sizes を見つけて (そして最大幅を収集し)、次にこの最大幅を Arrange-Result のパラメーターとして使用するためにもう 1 つのパスを渡します。しかし、どうすればこれを行うことができますか?各 ArrangeOverride で 2 つのパスを実行することはできないと思います。これは、すべての要素が降順要素のツリー全体の 2 つのパスを作成することになるからです。うーん。助言がありますか?
アップデート
このコードは、問題をより詳細に示しています。
public class CustomPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
Children[0].Measure(availableSize);
return Children[0].DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
Children[0].Arrange(new Rect(new Point(), new Size(finalSize.Width / 2, finalSize.Height)));
return finalSize;
}
}
<StackPanel>
<l:CustomPanel>
<TextBox />
</l:CustomPanel>
</StackPanel>
テキストボックスにテキストを入力してオーバーフローすると、使用できないスペースに拡張されます...