2010-05-13 30 views
9

我正在尝试使用滚动条创建画布。 任何人都可以帮助我提供一些关于如何做到这一点的想法? 我已经尝试使用1行1列的网格,但由于某些约束我想使用画布。如何在WPF画布上绘制滚动条

在此先感谢!

回答

16

您可以将画布放在滚动查看器中。我试过这个快速测试,它允许我滚动画布的内容。

<ScrollViewer Height="100" Width="200"> 
    <Canvas Height="400" Width="400"> 
      //Content here 
    </Canvas> 
</ScrollViewer> 

编辑:这里是仅在需要时的涡旋柱显示了一个例子,它动态地改变作为画布大小的变化。

<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> 

更改画布大小与按钮点击:

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

在这个例子中,我开始了,没有滚动条,当我点击按钮,扩展画布,滚动条显示。

+0

感谢您的回复。但事情是,我不知道我的画布的大小,直到运行时。所以不能有一个固定大小的画布。 如果用户在现有画布的边界附近单击,则会增加画布的尺寸,那么画布宽度和/或高度将增加50单位,并显示滚动条。 – Scooby 2010-05-13 19:00:11

+1

如果将滚动条的可见性设置为“自动”,这应该仍然有效。我修改我的例子来说明。 – 2010-05-13 20:17:04

1

好吧,在使用它一段时间后,我想出了一个办法。创建一个像这样的XAML

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

on windowLoad函数将画布高度/宽度设置为等于网格高度/宽度。更新画布ht/wd:

  1. 当网格大小发生变化时,由于mininmize/maximize。
  2. 拖动的元素超出画布的边界或创建一个新的元素太近帆布

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

希望这是一些帮助。如果有人有任何更好的想法或建议来改善这一点,请分享。

0

通过结合马里奥sannum的答案,你的问题,然后我做了应该在大多数情况下正常工作的解决方案..

<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 { } 
} 

这应该调整画布这样的ScrollViewer可以滚动...