1

グリッドの列/行定義で 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>

テキストボックスにテキストを入力してオーバーフローすると、使用できないスペースに拡張されます...

4

1 に答える 1

2

運が良ければ、ツリー全体のこれら 2 つのパスは既にレイアウト システムに組み込まれています。最初にパス中にすべての自然なサイズを収集し、MeasureOverride次にパス中にその情報を使用しArrangeOverrideて共有幅の値を選択します。

于 2011-04-21T05:42:35.260 に答える