先上效果图吧:
实现自定义面板主要实现两个方法:一、MeasureOverride()用于计算容器内部元素大小,这个很简单,代码略过;
二、ArrangeOverride()用于计算容器内部元素位置和其他显示方式,以下是实现上面布局的代码:
protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize)
{
double R;//正切于面板内部的圆半径
if (finalSize.Width > finalSize.Height)
{
R = finalSize.Height / 2;
}
else
{
R = finalSize.Width / 2;
}
double angleInc = 2 * Math.PI / (InternalChildren.Count);//根据元素个数确定每个元素所占度数
double angle = 0;//元素起始值度数为0
foreach (UIElement child in InternalChildren)
{
double r;
if (child.DesiredSize.Width > child.DesiredSize.Height)
{
r = child.DesiredSize.Height / 2;
}
else
{
r = child.DesiredSize.Width / 2;
}
Point loction = new Point(R + (R - r) * Math.Cos(angle) - r, R + (R - r) * Math.Sin(angle) - r);
angle += angleInc;
child.Arrange(new Rect(loction, child.DesiredSize));
}
return finalSize;
}
{
double R;//正切于面板内部的圆半径
if (finalSize.Width > finalSize.Height)
{
R = finalSize.Height / 2;
}
else
{
R = finalSize.Width / 2;
}
double angleInc = 2 * Math.PI / (InternalChildren.Count);//根据元素个数确定每个元素所占度数
double angle = 0;//元素起始值度数为0
foreach (UIElement child in InternalChildren)
{
double r;
if (child.DesiredSize.Width > child.DesiredSize.Height)
{
r = child.DesiredSize.Height / 2;
}
else
{
r = child.DesiredSize.Width / 2;
}
Point loction = new Point(R + (R - r) * Math.Cos(angle) - r, R + (R - r) * Math.Sin(angle) - r);
angle += angleInc;
child.Arrange(new Rect(loction, child.DesiredSize));
}
return finalSize;
}