将动态生成的项目放在按钮周围的圆圈中

时间:2013-05-29 13:07:03

标签: c# silverlight math geometry

我正在创建一个Silverlight应用程序,我必须动态创建按钮。但是我需要将它们放在我点击的按钮周围,以生成其他按钮(图片here,按钮应该放在“测试项目”按钮周围的黑线上)

我不知道每次会生成多少个按钮,但我知道每个按钮的大小是静态的。我不太清楚如何做到这一点。目前我的按钮创建如下

                foreach (Item a in itemList)
                {
                    Button newButton = new Button();
                    newButton.Height = 50;
                    newButton.Width = 50;
                    newButton.Content = a.getName();
                    newButton.Click += new RoutedEventHandler(addedClick);
                    newButton.HorizontalAlignment = HorizontalAlignment.Left;
                    newButton.VerticalAlignment = VerticalAlignment.Top;
                    newButton.Margin = new Thickness(0, 0, 0, 0);
                    newButton.Style = (Style)Application.Current.Resources["RB"];
                    buttons.Add(newButton);
                }

我最大的问题是我不太确定如何获得“测试项目”按钮的中心点。

编辑:好的,既然每个按钮都有一组坐标,我该如何放置它们呢?我不确定如何使用画布。我尝试设置一个,但它一直表现得像一个stackpanel(没有.setLeft / .setTop)。

3 个答案:

答案 0 :(得分:3)

你的意思是圆圈方程:

Double distanceFromCenter = 5;
Double angleInDegrees = 90;
Double angleAsRadians = (angleInDegrees* Math.PI) / 180.0;
Double centerX = 100;
Double centerY = 100;

Double x = centerX +  Math.Cos(angleAsRadians) * distanceFromCenter;
Double y = centerY + Math.Sin(angleAsRadians) * distanceFromCenter;

这应该给你一个distanceFromCenter单位远离(centerX, center),在angle 90度的点。请注意,这仅适用于弧度,因此我们必须转换为弧度。

答案 1 :(得分:2)

var radius = 100;
var angle = 360 / itmeList.Count * Math.PI / 180.0f;
var center = new Point(100, 100);

for (int i = 0; i < itemList.Count; i++)
            {
                var x = center.X +  Math.Cos(angle * i) * radius;
                var y = center.Y +  Math.Sin(angle * i) * radius;
                Button newButton = new Button();
                newButton.RenderTransformOrigin = new Point(x, y);
                newButton.Height = 50;
                newButton.Width = 50;
                newButton.Content = a.getName();
                newButton.Click += new RoutedEventHandler(addedClick);
                newButton.HorizontalAlignment = HorizontalAlignment.Left;
                newButton.VerticalAlignment = VerticalAlignment.Top;
                newButton.Margin = new Thickness(0, 0, 0, 0);
                newButton.Style = (Style)Application.Current.Resources["RB"];
                buttons.Add(newButton);
            }

答案 2 :(得分:1)

假设您希望按钮在圆上均匀分布,则应首先生成所需角度列表。 E.g。

double eachSection = 2 * Math.PI / count;
var anglesInRadians = Enumerable.Range(0, count).Select(x => x * eachSection);

然后使用此公式查找每个角度的x / y坐标,并使用Canvas或其他东西将按钮定位在这些位置

public static Point PointOnCircle(double radius, double angleInRadians, Point origin)
{
    double x = radius * Math.Cos(angleInRadians) + origin.X;
    double y = radius * Math.Sin(angleInRadians) + origin.Y;

    return new Point(x, y);
}