2011-04-08 17 views

Respuesta

18

formas Poner en lugares arbitrarios en la pantalla, probablemente, se debe hacer así que en un Panel de Lona (vea la respuesta de @phoog). Pero si lo ubica en una Cuadrícula u otro panel, siempre puede modificar la propiedad Margen para colocarlo donde lo desee.

Si quisiera hacerlo especificando el punto en lugar de la esquina superior izquierda de la elipse central, usted puede hacer esto:

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

No he comprobado que esto es exactamente lo que quiere en el compilador, pero espero que entiendas la idea. Una vez más, el uso de lienzo sería el método preferido sobre el uso del margen interior de un panel no lienzo, pero el mismo principio de calcular la izquierda y arriba seguiría aplicándose:

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

¿Por qué no hay propiedades Left? WPF es tan raro ... – Kamil

+1

@Kamil el posicionamiento en este caso es una propiedad del contanier, no la elipse en sí. En un lienzo, establece la propiedad 'Canvas.Left'. De hecho, raro ... – heltonbiker

+0

@heltonbiker Creo que hay una razón por la que está diseñado así, pero aún no descubrí esa razón. – Kamil

13

Canvas.Left y Canvas.Top. Todo está en la documentación sobre "Cómo dibujar una elipse o un círculo" http://msdn.microsoft.com/en-us/library/ms751563.aspx

En código C#, la sintaxis sería la siguiente:

+0

Gracias, probé esos en código pero no funciona. Hice esto: 'elipse.Canvas.Left', pero no hay propiedad' Canvas' en un objeto 'Ellipse'. –

+1

Edité mi respuesta para mostrar la sintaxis de C#. La propiedad Canvas.Left (y .Top, .Bottom, .Right) son propiedades adjuntas. Consulte la descripción general en http://msdn.microsoft.com/en-us/library/ms749011.aspx – phoog

-1

Si usted tiene los puntos inicial y final, así como el radio y un booleano para si es en el sentido de las agujas del reloj o no, entonces use mi función :)

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