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