2

ボタンを動的に作成する必要がある Silverlight アプリケーションを作成しています。しかし、他のボタンを生成するためにクリックするボタンの周りにそれらを円で配置する必要があります (ここの写真、ボタンは「テスト プロジェクト」ボタンを囲む黒い線に移動する必要があります)。

毎回生成されるボタンの数はわかりませんが、各ボタンのサイズが静的であることはわかっています。これを行う方法がよくわかりません。現在、私のボタンの作成は次のとおりです

                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);
                }

私の最大の問題は、「テスト プロジェクト」ボタンの中心点を取得する方法がよくわからないことです。

編集: さて、各ボタンの一連の座標を取得したので、それらを配置するにはどうすればよいでしょうか? キャンバスの使い方がわかりません。設定しようとしましたが、スタックパネルのように動作し続けます (.setLeft/.setTop はありません)。

4

3 に答える 3

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から 単位離れた90 度の点が得られるはずです。これはラジアンでのみ機能するため、ラジアンに変換する必要があることに注意してください。(centerX, center)angle

于 2013-05-29T13:19:52.307 に答える
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);
            }
于 2013-05-29T13:23:21.513 に答える
1

ボタンを円上に等間隔に配置する場合は、最初に配置する角度のリストを生成する必要があります。例えば

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

次に、この式を使用して各角度の x/y 座標を見つけ、aCanvasまたは何かを使用してそれらの位置にボタンを配置します。

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);
}
于 2013-05-29T13:25:25.747 に答える