2011-04-08 69 views

回答

18

在屏幕上任意地方把形狀也許應該做所以在一個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.SetLeft(ellipse, desiredCenterX - (width/2)) 
Canvas.SetTop(ellipse, desiredCenterY - (height/2)) 
+1

爲什麼沒有Left屬性? WPF是如此奇怪... – Kamil 2013-05-28 19:18:45

+1

@Kamil在這種情況下的定位是contanier的屬性,而不是橢圓本身。在畫布中,您可以設置Canvas.Left屬性。確實很奇怪...... – heltonbiker 2013-05-29 16:18:56

+0

@heltonbiker我想這是爲什麼它是這樣設計的,但我沒有發現這個理由。 – Kamil 2013-05-31 02:04:28

13

Canvas.Left and Canvas.Top。這一切都在文檔中的「如何繪製橢圓或圓」 http://msdn.microsoft.com/en-us/library/ms751563.aspx

在C#代碼,語法是這樣的:

+0

謝謝,我試過那些代碼,但不起作用。我這樣做了:'ellipse.Canvas.Left',但是'Ellipse'對象沒有'Canvas'屬性。 – 2011-04-08 00:59:04

+1

我編輯了我的答案以顯示C#語法。 Canvas.Left屬性(和.Top,.Bottom,.Right)是附加屬性。請參閱http://msdn.microsoft.com/en-us/library/ms749011.aspx上的概述 – phoog 2011-04-08 01:04:03

-1

如果你有起點和終點以及作爲半徑和布爾如果它是順時針或不,然後使用我的功能:)

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