Pregunta

Necesito implementar un Canvas que escala su contenido de acuerdo con su tamaño. Sé que hay Viewbox , que escala todo dentro de él. Sin embargo, no puedo usar eso, porque algunos elementos tienen un tamaño fijo y no se pueden escalar.

Además, ¿cómo puedo vincular el tamaño del Canvas al elemento padre (por ejemplo, una ventana de tamaño variable). Hay sizeToContent para Windows, quiero que el tamaño se ajuste exactamente al revés. Además, el lienzo usa un dibujo basado en el tamaño del elemento de alojamiento, ¿cómo se desencadena el redibujo y cómo puedo asegurarme de que solo se dibuje si obtiene un tamaño válido (o mínimo)?

¿Fue útil?

Solución

Si no especifica ningún ancho o alto al lienzo, automáticamente usa todo el espacio disponible. Esto se debe a que los VerticalAlignment y HorizontalAlignment predeterminados están configurados en Stretch .

¿Qué quiere decir con lienzo que escala su contenido de acuerdo con su tamaño sin escalar todo el contenido ya que algunos tienen un tamaño fijo?

Actualizar después de los comentarios

Si su algoritmo de dibujo ya escala el contenido a la altura y el ancho del lienzo, ¿entonces todo lo que necesita hacer es cambiar el tamaño del lienzo para que se ajuste al área que creo? En ese caso, simplemente elimine los valores de alto / ancho codificados y el lienzo cambiará de tamaño para adaptarse al contenedor.

Es posible que tengas que usar ActualHeight / ActualWidth en lugar de Height / Width en el algoritmo de dibujo después de esto. ActualHeight / ActualWidth devuelve los valores que el contenedor de diseño le dará a su lienzo para que estos representen los valores con los que se dibuja el lienzo.

Otros consejos

Creo que puedes encontrar las respuestas a todas tus preguntas en mi Demostración del metro de Londres .

Estoy haciendo esto desde la memoria, pero si recuerdo correctamente, una ventana usa un panel o un lienzo como parte de su ControlTemplate (en el que se encuentra ContentPresenter), lo que significa que un lienzo colocado directamente en una ventana tendrá problemas de cambio de tamaño automáticamente como podría hacerlo en otro lugar. Hay algunas formas básicas de abordar esto.

1 Escriba un nuevo ControlTemplate para que su ventana lo use. :(
2 Coloque su contenido directamente en la ventana en lugar de en un lienzo dentro de la ventana.: /
3 Haga un enlace por nombre. :)

<MyWindow x:Name="topWindow">
    <Canvas x:Name="topCanvas" Width="{Binding ElementName=topWindow, Path=ActualWidth}" Height="{Binding ElementName=topWindow, Path=ActualHeight}">
        ...Content...
    </Canvas>
</MyWindow>

(Como sucede, a menudo ato las cuadrículas dentro de los lienzos de esta manera, para poder animar fácilmente los elementos que se mueven de una posición de cuadrícula a otra).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top