如何在WPF Canvas上绘制滚动条

时间:2010-05-13 17:35:59

标签: wpf canvas scrollbars

我正在尝试使用滚动条创建一个画布。 任何人都可以帮我提一些如何做到这一点的想法吗? 我已经尝试过使用1行和1列的网格,但由于某些限制,我想使用canvas。

提前致谢!

3 个答案:

答案 0 :(得分:19)

您可以将画布放在scrollviewer中。我尝试了这个快速测试,它允许我滚动画布的内容。

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

在这个例子中,我开始时没有滚动条,当我单击按钮展开画布时,会出现滚动条。

答案 1 :(得分:1)

好好用了一段时间后我找到了办法。像这样创建一个XAML

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

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

  1. 当网格大小发生变化时,由于最小化/最大化。
  2. 将一个元素拖出画布边界或创建一个太靠近画布边缘的新元素

    double dHeight = 220;
    if (drawingCanvas.Height < CurrentPosition.Y + dHeight)
    {
        // increase canvas height
        drawingCanvas.Height += (2 * dHeight);
    }
    
  3. 希望这有一些帮助。如果有人有任何更好的想法或建议来改善这一点,请分享。

答案 2 :(得分:0)

通过结合Mario-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 { }
}

那应该调整Canvas的大小,以便scrollviewer可以滚动...