C# 径向菜单
我最近创建了一个HTML页面,我使用了这个菜单(见图)。我需要在WPF中创建类似的东西。有人知道如何做到这一点吗。非常感谢。C# 径向菜单,c#,wpf,xaml,C#,Wpf,Xaml,我最近创建了一个HTML页面,我使用了这个菜单(见图)。我需要在WPF中创建类似的东西。有人知道如何做到这一点吗。非常感谢。 - 基础设施有一个网站,但它不是免费的 有很多例子 可能是比较好的一种 基本上,开始的方法是创建一个径向布置的面板,即圆形。大多数示例都是从Panel类继承开始的。然后重写MeasureOverride和ArrangeOverride方法。下面的代码是一个相当简单的例子。我们假设一个固定的项目大小(ItemHeight和ItemWidth)。有一个字段“UseFerris
-
基础设施有一个网站,但它不是免费的
有很多例子 可能是比较好的一种 基本上,开始的方法是创建一个径向布置的面板,即圆形。大多数示例都是从Panel类继承开始的。然后重写MeasureOverride和ArrangeOverride方法。下面的代码是一个相当简单的例子。我们假设一个固定的项目大小(ItemHeight和ItemWidth)。有一个字段“UseFerrisWheelLayout”,允许您根据项目在圆中的位置控制项目是直的还是变换的
public class RadialPanel : Panel
{
protected override Size MeasureOverride(Size constraint)
{
if (constraint.Width == double.PositiveInfinity || constraint.Height == double.PositiveInfinity)
return Size.Empty;
foreach (UIElement child in InternalChildren)
{
child.Measure(new Size(ItemWidth, ItemHeight));
}
return constraint;
}
protected override Size ArrangeOverride(Size finalSize)
{
// Calculate radius
double radiusX = (finalSize.Width - ItemWidth) * 0.5;
double radiusY = (finalSize.Height - ItemHeight) * 0.5;
double count = InternalChildren.Count;
// Sector angle between items
double deltaAngle = 2 * Math.PI / count;
// Center of the ellipse
Point center = new Point(finalSize.Width / 2, finalSize.Height / 2);
for (int i = 0; i < count; i++)
{
UIElement child = InternalChildren[i];
// Calculate position
double angle = i * deltaAngle;
double x = center.X + radiusX * Math.Cos(angle) - ItemWidth / 2;
double y = center.Y + radiusY * Math.Sin(angle) - ItemHeight / 2;
if (UseFerrisWheelLayout)
{
child.RenderTransform = null;
}
else
{
child.RenderTransformOrigin = new Point(0.5, 0.5);
child.RenderTransform = new RotateTransform(angle * 180 / Math.PI);
}
child.Arrange(new Rect(x, y, ItemWidth, ItemHeight));
}
return finalSize;
}
}
public class RadialPanel:面板
{
受保护的覆盖尺寸测量覆盖(尺寸约束)
{
if(constraint.Width==double.PositiveInfinity | | constraint.Height==double.PositiveInfinity)
返回大小。空;
foreach(InternalChildren中的UIElement子元素)
{
测量(新尺寸(ItemWidth、ItemHeight));
}
回报约束;
}
受保护的替代尺寸排列替代(尺寸最终化)
{
//计算半径
双半径x=(finalSize.Width-ItemWidth)*0.5;
双半径Y=(最终尺寸高度-项目高度)*0.5;
重复计数=内部子项计数;
//项目间扇形角
双三角角=2*Math.PI/计数;
//椭圆中心
点中心=新点(最终尺寸宽度/2,最终尺寸高度/2);
for(int i=0;i
这可能是最好的开始,然后您可以开始定制您的需求