Cómo dibujar barras de desplazamiento en WPF Canvas
scrollbars (3)
Estoy tratando de crear un lienzo con barras de desplazamiento. ¿Alguien puede ayudarme a dar algunas ideas sobre cómo hacer esto? Ya he intentado usar la cuadrícula de 1 fila y 1 columna, pero debido a ciertas restricciones quiero usar lienzo.
¡Gracias por adelantado!
Ok, después de trabajar con él por algún tiempo, descubrí una forma. Crea un XAML como este
<ScrollViewer>
<Grid x:Name="drawingGrid" SizeChanged="drawingGrid_SizeChanged">
<Canvas Name="drawingCanvas"> /<Canvas>
</Grid>
</ScrollViewer>
En la función de carga de ventana configure el alto / ancho del lienzo igual a la altura / ancho de la grilla. Actualice el canvas ht / wd:
- cuando cambia el tamaño de la cuadrícula, debido a mininmize / maximize.
arrastrar un elemento más allá de los límites del lienzo o crear un nuevo elemento demasiado cerca del borde del lienzo
double dHeight = 220; if (drawingCanvas.Height < CurrentPosition.Y + dHeight) { // increase canvas height drawingCanvas.Height += (2 * dHeight); }
Espero que esto sea de alguna ayuda. Por favor, comparta si alguien tiene alguna idea o sugerencia mejor para mejorar esto.
Podría poner el lienzo dentro de un scrollviewer. Probé esta prueba rápida y me permitió desplazarme por los contenidos del lienzo.
<ScrollViewer Height="100" Width="200">
<Canvas Height="400" Width="400">
//Content here
</Canvas>
</ScrollViewer>
editar: Aquí hay un ejemplo donde las barras de desplazamiento aparecen solo cuando es necesario, y cambia dinámicamente a medida que cambia el tamaño del lienzo.
<Button Content="Change Canvas Size" Click="ChangeCanvasSize_Click"/>
<ScrollViewer Height="100" Width="200" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Canvas x:Name="TestCanvas">
<TextBlock Text="Test Test"/>
</Canvas>
</ScrollViewer>
Cambiar el tamaño del lienzo con un clic del botón:
private void ChangeCanvasSize_Click(object sender, RoutedEventArgs e)
{
TestCanvas.Width = 600;
TestCanvas.Height = 600;
}
En este ejemplo, comienzo sin barras de desplazamiento y cuando hago clic en el botón para expandir el lienzo, aparecen las barras de desplazamiento.
Al combinar la respuesta de Mario-sannum y su pregunta, he creado una solución que debería funcionar bien en la mayoría de los casos.
<ScrollViewer>
<Grid x:Name="drawingGrid" SizeChanged="drawingGrid_SizeChanged">
<Canvas Name="c">
<TextBlock x:Name="draw_Text" Text="Test Test"/>
</<Canvas>
</Grid>
</ScrollViewer>
void drawingGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
try { c.Height = draw_Text.ActualHeight; } catch { }
try { c.Width = draw_Text.ActualWidth; } catch { }
}
Eso debería redimensionar el lienzo para que el scrollviewer pueda desplazarse ...