0

私は、子の配置が絶対オフセットではなくパーセンテージで表されることを除いて、Panelと同様に機能するカスタム WPF に取り組んでいます。私が呼んでいるは、次Canvasのように使用されます。PanelPercentageCanvas

<Window>
  <local:PercentageCanvas>
    <ChildElement local:PercentageCanvas.Left=".30" local:PercentageCanvas.Top=".50" />
    <ChildElement local:PercentageCanvas.Left="0" local:PercentageCanvas.Top=".9" />
      ... etc ...
  </local:PercentageCanvas>
</Window>

PercentageCanvas期待したほどではありませんが、動作しています。の子は、私が予想していたように、左上端ではなく、子の中心PercentageCanvasに対して相対的に配置されます。この動作を実現するために使用する方法は次のとおりです。ArrangeOverride

protected override Size ArrangeOverride(Size finalSize)
{
    int currentIndex = 0;

    for (int index = InternalChildren.Count - 1; index >= 0; index--)
    {
        Rect rect = new Rect(finalSize);

        rect.Location = new Point()
        {
            X = finalSize.Width * PercentagePanel.GetLeft(InternalChildren[index]) - finalSize.Width / 2,
            Y = finalSize.Height * PercentagePanel.GetTop(InternalChildren[index]) - finalSize.Height / 2
        };

        InternalChildren[index].Arrange(rect);
        currentIndex++;
    }

    return finalSize;
}

この中心配置動作に対抗するには、各子の寸法を把握し、 の を計算する際に子のサイズを補正する必要があるようLocationですRect。ただし、適切なオフセットを計算するために、子のサイズにアクセスできないようです。

メソッドで子のレイアウトを計算するときに、Panel の子のサイズをどのように考慮することができますArrangeOverrideか?

4

1 に答える 1

1

質問を書いている途中で答えを見つけました。すべてに、私が探しているものを正確に提供UIElementsするプロパティがあります。DesiredSize私のArrangeOverrideメソッドは次のようになります (違いを確認するには、右にスクロールする必要があります)。

protected override Size ArrangeOverride(Size finalSize)
{
    int currentIndex = 0;

    for (int index = InternalChildren.Count - 1; index >= 0; index--)
    {
        Rect rect = new Rect(finalSize);

        rect.Location = new Point()
        {
            X = finalSize.Width * PercentagePanel.GetLeft(InternalChildren[index]) - finalSize.Width / 2 + (InternalChildren[index].DesiredSize.Width / 2),
            Y = finalSize.Height * PercentagePanel.GetTop(InternalChildren[index]) - finalSize.Height / 2 + (InternalChildren[index].DesiredSize.Height / 2)
        };

        InternalChildren[index].Arrange(rect);
        currentIndex++;
    }

    return finalSize;
}

要素は、中心ではなく左上隅を基準にして配置されるようになりました。

于 2014-03-14T23:21:28.580 に答える