2010-05-13 18 views
9

Estoy intentando crear un lienzo con barras de desplazamiento. ¿Alguien me puede ayudar 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 limitaciones quiero usar lienzo.Cómo dibujar barras de desplazamiento en WPF Lienzo

¡Gracias de antemano!

Respuesta

16

Puede poner el lienzo dentro de un visualizador de desplazamiento. 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: He aquí un ejemplo en el que las barras de desplazamiento aparecen sólo cuando sea 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 el botón de clic:

private void ChangeCanvasSize_Click(object sender, RoutedEventArgs e) 
    { 
     TestCanvas.Width = 600; 
     TestCanvas.Height = 600; 
    } 

En este ejemplo, comienzo a cabo sin barras de desplazamiento, y al hacer clic en el botón para ampliar el lienzo, barras de desplazamiento aparecen.

+0

Gracias por su respuesta. Pero el problema es que no sé el tamaño de mi lienzo hasta el tiempo de ejecución. Entonces no puede tener un lienzo de tamaño fijo. Aumentaré la dimensión del lienzo si el usuario, por ejemplo, hace clic cerca del límite del lienzo existente, entonces el ancho y/o altura del lienzo aumentará en, por ejemplo, 50 unidades y aparecerá la barra de desplazamiento. – Scooby

+1

Esto debería funcionar, si configura la visibilidad de las barras de desplazamiento en "Auto". Modifiqué mi ejemplo para ilustrar. –

1

Ok, después de trabajar con él por algún tiempo, descubrí una manera. Crear un XAML como este

<ScrollViewer> 
<Grid x:Name="drawingGrid" SizeChanged="drawingGrid_SizeChanged"> 
<Canvas Name="drawingCanvas"> /<Canvas> 
</Grid> 
</ScrollViewer> 

En función windowLoad ajustar la altura de la lona/anchura igual a la rejilla altura/anchura. Actualice el lienzo ht/wd:

  1. cuando cambia el tamaño de la cuadrícula, debido a mininmize/maximize.
  2. arrastrando un elemento más allá de los límites del lienzo o la creación de un nuevo elemento demasiado cerca del borde de la lona

    double dHeight = 220; 
    if (drawingCanvas.Height < CurrentPosition.Y + dHeight) 
    { 
        // increase canvas height 
        drawingCanvas.Height += (2 * dHeight); 
    } 
    

Esperamos que este sea de alguna ayuda. Por favor, comparta si alguien tiene alguna idea o sugerencia mejor para mejorar esto.

0

Mediante la combinación de la respuesta de Mario-Sannum y su pregunta, he hecho 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 debe cambiar el tamaño del lienzo lo que el ScrollViewer puede desplazarse ...

Cuestiones relacionadas