Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 径向菜单_C#_Wpf_Xaml - Fatal编程技术网

C# 径向菜单

C# 径向菜单,c#,wpf,xaml,C#,Wpf,Xaml,我最近创建了一个HTML页面,我使用了这个菜单(见图)。我需要在WPF中创建类似的东西。有人知道如何做到这一点吗。非常感谢。 - 基础设施有一个网站,但它不是免费的 有很多例子 可能是比较好的一种 基本上,开始的方法是创建一个径向布置的面板,即圆形。大多数示例都是从Panel类继承开始的。然后重写MeasureOverride和ArrangeOverride方法。下面的代码是一个相当简单的例子。我们假设一个固定的项目大小(ItemHeight和ItemWidth)。有一个字段“UseFerris

我最近创建了一个HTML页面,我使用了这个菜单(见图)。我需要在WPF中创建类似的东西。有人知道如何做到这一点吗。非常感谢。
-

基础设施有一个网站,但它不是免费的


有很多例子

可能是比较好的一种

基本上,开始的方法是创建一个径向布置的面板,即圆形。大多数示例都是从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
这可能是最好的开始,然后您可以开始定制您的需求