如何在WPF画布上绘制滚动条

12

我想创建一个带有滚动条的画布。 有谁能给我提供一些如何做到这一点的想法吗? 我已经尝试使用 1 行 1 列的网格,但由于某些限制,我想使用画布。

先行致谢!

3个回答

20

您可以在一个滚动视图控件中放置画布。我进行了快速测试,它允许我滚动画布的内容。

<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;
    }
在这个例子中,开始时没有滚动条,当我点击按钮扩展画布时,滚动条出现了。

感谢您的回复。但问题是,我在运行时不知道画布的大小。因此无法拥有固定大小的画布。 如果用户点击现有画布边界附近,则会增加画布的尺寸,例如增加50个单位的宽度和/或高度,并且滚动条应该出现。 - Scooby
1
如果将滚动条的可见性设置为“自动”,这仍然可以工作。我修改了我的示例以说明。 - Ben Collier

3

好的,在使用一段时间后,我找到了一种方法。创建一个像这样的XAML:

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

在windowLoad函数中,将画布的高度/宽度设置为网格的高度/宽度。更新画布的高度/宽度:
  1. when grid size changes, due to mininmize/maximize.
  2. dragging an element beyond the boundaries of canvas or creating a new element too close the edge of canvas

    double dHeight = 220;
    if (drawingCanvas.Height < CurrentPosition.Y + dHeight)
    {
        // increase canvas height
        drawingCanvas.Height += (2 * dHeight);
    }
    
希望这些内容能对您有所帮助。如果有其他更好的想法或建议,请分享出来。

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

那应该调整画布大小,使滚动查看器可以滚动...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接