如何在WPF中指定画布上椭圆形状的位置?

时间:2011-04-08 00:49:42

标签: c# .net wpf graphics shapes

我正在以编程方式创建一个Ellipse形状,但我找不到任何指定其位置的属性。 Lines具有X1,Y1,X2,Y2,但椭圆形状上没有中心,位置,X,Y等。我怎么能这样做?

3 个答案:

答案 0 :(得分:21)

将形状放在屏幕上的任意位置应该可以在Canvas面板中完成(请参阅@ phoog的回复)。但是,如果您将其放在网格或其他面板中,您可以随时修改边距属性以将其放置在您想要的位置。

如果您想通过指定中心点而不是椭圆的左上角来执行此操作,则可以执行以下操作:

Ellipse CreateEllipse(double width, double height, double desiredCenterX, double desiredCenterY)
{
    Ellipse ellipse = new Ellipse { Width = width, Height = height };
    double left = desiredCenterX - (width / 2);
    double top  = desiredCenterY - (height/ 2);

    ellipse.Margin = new Thickness(left, top, 0, 0);
    return ellipse;
}

我没有检查过这在编译器中是否完全符合您的要求,但希望您明白这一点。同样,使用Canvas将是在非Canvas面板中使用Margin的首选方法,但计算left和top的原理仍然适用:

Canvas.SetLeft(ellipse, desiredCenterX - (width/2))
Canvas.SetTop(ellipse, desiredCenterY - (height/2))

答案 1 :(得分:14)

Canvas.Left和Canvas.Top。这些都在关于“如何绘制椭圆或圆形”的文档中http://msdn.microsoft.com/en-us/library/ms751563.aspx

在C#代码中,语法如下:

void CreateCanvasWithEllipse(double desiredLeft, double desiredTop)
{
    Canvas canvas = new Canvas();
    Ellipse ellipse = SomeEllipseConstructionMethod();
    Canvas.SetLeft(ellipse, desiredLeft);
    Canvas.SetTop(ellipse, desiredTop);
}

答案 2 :(得分:0)

如果您有起点和终点以及半径和布尔值,如果它是顺时针或不是,那么使用我的函数:)

function ellipse(x1, y1, x2, y2, radius, clockwise) {
    var cBx = (x1 + x2) / 2;    //get point between xy1 and xy2
    var cBy = (y1 + y2) / 2;
    var aB = Math.atan2(y1 - y2, x1 - x2);  //get angle to bulge point in radians
    if (clockwise) { aB += (90 * (Math.PI / 180)); }
    else { aB -= (90 * (Math.PI / 180)); }
    var op_side = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) / 2;
    var adj_side = Math.sqrt(Math.pow(radius, 2) - Math.pow(op_side, 2));

    if (isNaN(adj_side)) {
        adj_side = Math.sqrt(Math.pow(op_side, 2) - Math.pow(radius, 2));
    }

    var Cx = cBx + (adj_side * Math.cos(aB));            
    var Cy = cBy + (adj_side * Math.sin(aB));
    var startA = Math.atan2(y1 - Cy, x1 - Cx);       //get start/end angles in radians
    var endA = Math.atan2(y2 - Cy, x2 - Cx);
    var mid = (startA + endA) / 2;
    var Mx = Cx + (radius * Math.cos(mid));
    var My = Cy + (radius * Math.sin(mid));
    context.arc(Cx, Cy, radius, startA, endA, clockwise);
}