2011-02-24 10 views
19

que tienen una trayectoria (se parece a un óvalo):WPF: ¿la forma correcta de escalar un camino?

<Path Data="Bla Bla"/> 

Ahora quiero escalar el ancho de la ruta y la altura de lo que me gusta. He encontrado una manera:

<Grid Width="400" Height="50"> 
<Viewbox Stretch="Fill"> 
    <Path Data="Bla Bla"/> 
</Viewbox> 
</Grid> 

Y esto funciona, pero me pregunto si esta es la forma más eficiente de hacer esto? (Tuve que introducir una rejilla y negatoscopio para hacer esto)

Respuesta

17

Otra manera de escalar una ruta de acceso es utilizar RenderTransform o LayoutTransform

<Path Data="Bla Bla" 
     RenderTransformOrigin="0.5, 0.5"> 
    <Path.RenderTransform> 
     <ScaleTransform ScaleX="1.5" ScaleY="1.5"/> 
    </Path.RenderTransform> 
</Path> 
+4

Generalmente prefieren un 'LayoutTransform' modo que cuando el' path' crece, el espacio que ocupa en una 'Panel' también lo hará. – user7116

+1

@sixlettervariables: Sí, de hecho, a menos que sea para los escenarios en los que desee lo contrario :) Pero como usted dice, en la mayoría de los casos 'LayoutTransform' es el que desea que use –

+1

También creo que LayoutTransform no afecta el grosor del trazo mientras un RenderTransform lo hace. – MarqueIV

7

Usted tiene básicamente 3 formas de ampliar un camino:

  1. envolverlo en un ViewBox
  2. Aplicar una ScaleTransform
  3. explícitamente establecer un ancho y una altura

El método 1. y 2. arrojará el mismo resultado, mientras que 3. es ligeramente diferente porque la forma cambiará de tamaño, pero la carrera mantendrá el grosor original (por lo que no es realmente un zoom).

El método 1. sería apropiado cuando tenga un área de un tamaño determinado que desee llenar. Por otro lado, el método 2. será útil para ampliar (o reducir) la ruta en una cantidad dada, por ej. dos veces el tamaño original.

12

solo para su información, ya que ViewBox usa ScaleTransform en su interior, básicamente es igual de bueno en cuanto a rendimiento.

1

que podría hacerlo programmaticaly, como http://social.msdn.microsoft.com/Forums/vstudio/en-US/a0d473fe-3235-4725-aa24-1ea9307752d3/how-to-rendertransform-in-code-behind-c?forum=wpf

kUIWEB:kArrow mArrow = new kUIWEB:kArrow(); 
mArrow.Width=30; 
mArrow.Height=30; 
mArrow.RenderTransformOrigin=new Point(0.5, 0.5); 


ScaleTransform myScaleTransform = new ScaleTransform(); 
myScaleTransform.ScaleY = 1; 
myScaleTransform.ScaleX = 1; 

RotateTransform myRotateTransform = new RotateTransform(); 
myRotateTransform.Angle = 0; 

TranslateTransform myTranslate = new TranslateTransform(); 
myTranslate.X = 12; 
myTranslate.X = 15; 

SkewTransform mySkew = new SkewTransform(); 
mySkew.AngleX=0; 
mySkew.AngleY=0; 

// Create a TransformGroup to contain the transforms 
// and add the transforms to it. 
TransformGroup myTransformGroup = new TransformGroup(); 
myTransformGroup.Children.Add(myScaleTransform); 
myTransformGroup.Children.Add(myRotateTransform); 
myTransformGroup.Children.Add(myTranslate); 
myTransformGroup.Children.Add(mySkew); 

// Associate the transforms to the object 
mArrow.RenderTransform = myTransformGroup; 
+5

Tenga en cuenta que [las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) no se recomiendan, por lo que las respuestas deberían ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

Cuestiones relacionadas