2010-05-05 7 views
14

Tengo una ruta que debe redimensionarse a su contenedor StackPanel.WPF: Cómo autoescalar ruta a su contenedor?

<StackPanel x:Name="TrackSurface"> 
    <Path Fill="AliceBlue" 
      Stroke="Black" StrokeThickness="1" 
      Data="{StaticResource TranslateZ}"> 
    </Path> 
</StackPanel> 

Pienso en utilizar una transformación vinculada al contenedor pero no sé cómo hacerlo en realidad. ¿Puede alguien darme una pista?

Respuesta

19

Cambié el Stackpanel a Grid y Stretch propiedad de la ruta para completar.

<Grid x:Name="TrackSurface"> 
<Path Fill="AliceBlue" 
Stretch="Fill" 
     Stroke="Black" StrokeThickness="1" 
     Data="M148,28 C221,133 110.50025,119.5 110.50025,119.5 L124.50016,68.5 z"> 
</Path> 

+0

Gracias Kishore. No funciona en mi caso. Tengo una Grilla con un UserControl en una fila, la Ruta está en el UserControl. No debe extender el ancho de la columna. Es por eso que utilicé un StackPanel. He reemplazado a OnRenderSizeChanged en UserControl para mantener una relación de aspecto de 1. Por lo tanto, la ruta necesita llenar un UserControl al cuadrado cuyo tamaño es el ancho de la columna. No estoy seguro de que esté claro. Con su solución, el ancho de la columna se extiende para coincidir con la caja de distribución original de la ruta. – 742

+1

@ 742, ¿viste mi respuesta a continuación? ¿Por qué no usar un ViewBox? (Ok, esto tiene tres años, pero alguien acaba de votar mi respuesta que me trajo aquí.) – MarqueIV

+0

Solo agrego más información. De esta manera funciona, pero está limitado porque está forzando la ruta para estirar para llenar su contenedor, lo que puede no ser siempre el caso. Piensa en el símbolo para las mujeres ... un círculo con una cruz en la parte inferior. Si su ruta tiene su espacio establecido y desea que el centro del círculo esté en el centro del área de visualización, su ruta debe tener coordenadas que estén relacionadas con su contenedor. Establezca el contenedor (Cuadrícula) al tamaño de las extensiones, luego coloque la ruta en él. (Continúa abajo ...) – MarqueIV

3

asegurarse de que su camino es más pequeño que su StackPanel.

La manera más fácil para un camino muy fácil será para mover la coma en cada número (es decir, dividir todo por 10 o 100 en TranslateZ), o para más caminos complicados añaden un LayoutTransform (disminuir el factor de escala según sea necesario):

<StackPanel x:Name="TrackSurface"> 
    <Path Fill="AliceBlue" Stroke="Black" StrokeThickness="1" 
      Data="{StaticResource TranslateZ}"> 
      <Path.LayoutTransform> 
       <ScaleTransform ScaleX="0.1" ScaleY="0.1"/> 
      </Path.LayoutTransform> 
    </Path> 
</StackPanel> 

Algunas observaciones:

yo tuvimos un problema similar, con una plantilla de botones que contiene una ruta de acceso. El tamaño "automático" del botón fue determinado por la ruta, porque la ruta tenía las dimensiones más grandes del contenido de la plantilla.

Esto en sí mismo puede no resultar como un problema, ya que si se especifica del botón de altura/anchura, o si el botón de horizontal-/VerticalAlignment se establece para estirar, por supuesto, el camino se escala.

Para otros valores de horizontal-/VerticalAlignment Sin embargo, el tamaño del botón consigue determinada por la cantidad de espacio requerido por su contenido, que en mi caso resultó en un botón con originales dimensiones del trazado.

12

¿Alguna razón por la que no está usando un ViewBox para esto? Eso encogerá o hará crecer el camino según sea necesario. Si no quiere que se escale, sino que se recorta, configure el modo de recorte para restringirlo al cuadro delimitador del control. (Me gustaría envolver el camino en un ContentPresenter para eso.)

+1

Esto es viejo, pero sigue siendo la mejor respuesta. Todo lo que tenía que hacer era envolver mi 'Path's en' Grid' dentro de 'ViewBox', y todo era perfecto. – moswald

Cuestiones relacionadas