2012-01-04 27 views
8

Tengo un lienzo con 2 "puntos" dibujados en él. Ver el código (simplificado):Encuadernación a X Y coordenadas del elemento en WPF Canvas

<Canvas> 
    <Ellipse /> 
    <Ellipse /> 
    <Canvas.RenderTransform> 
     <RotateTransform x:Name="rotateEllipse" /> 
    </Canvas.RenderTransform> 
</Canvas> 

Como se puede ver, quiero girar el lienzo con la RotateTransform dado.

A continuación, quiero poner un TextBlock cerca de cada Elipse (una etiqueta). Sin embargo, no quiero incluir este TextBlock en el lienzo porque también rotará. Quiero que el texto permanezca horizontal.

¿Alguna idea de cómo resolver esto de una manera elegante?

Respuesta

3

algo como esto, debe trabajo por usted

<TextBlock RenderTransform="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, 
                 Path=RenderTransform.Inverse}"/> 

Asignar a un cuadro de texto transformation matrixinversa de la matriz de transformación de la Canvas.

+0

Esto es básicamente lo que he hecho también. – mydogisbox

0

¡Buena pregunta! Y voy a adivinar, así que por favor toma esta respuesta con un poco de sal.

Creo que está tratando de colocar anotaciones de texto al lado de puntos suspensivos en un lienzo girado, pero estas anotaciones deben permanecer horizontales. Dos cosas que usted podría intentar:

  • En primer lugar, dado el punto XY que sabes de cada elipse desde Canvas.GetTop/getLeft, usted podría encontrar su nueva ubicación rotada XY aplicando el RotateTransform a la ubicación elipse, usando la fórmula U = M * V, donde U es el punto de salida, V es el punto de entrada (ubicación XY de elipse) y M es la Matriz de Rotación.

  • En segundo lugar, podría colocar un segundo lienzo sobre el primero (suponiendo que ambos están en una cuadrícula, el segundo lienzo tiene un índice Z más alto y es del mismo tamaño que el lienzo subyacente). Llámalo una capa de anotación. Sus anotaciones (etiquetas de texto) pueden aparecer en las nuevas ubicaciones transformadas y sin girar utilizando este enfoque.

Habría que hacer esto en código, por supuesto, no Xaml, aunque es posible que encontrar un acercamiento amistoso vinculante mediante la creación de un convertidor de valores en el TextBlock que se unió a la fuente RotateTransform/Elipse y lo hizo esta operación para ti.

Otro enfoque sería tomar el .Inverso de RotateTransform y aplicarlo a los bloques de texto, sin embargo, es posible que aún tenga que traducir para llegar a la nueva ubicación. De cualquier manera, creo que exige algo de experimentación.

Saludos,

Cuestiones relacionadas