Как рисовать полосы прокрутки на холсте WPF - PullRequest
11 голосов
/ 13 мая 2010

Я пытаюсь создать холст с полосами прокрутки. Может кто-нибудь помочь мне дать некоторые идеи о том, как это сделать? Я уже пробовал использовать сетку из 1 строки и 1 столбца, но из-за определенных ограничений я хочу использовать canvas.

Заранее спасибо!

Ответы [ 3 ]

20 голосов
/ 13 мая 2010

Вы можете поместить холст внутри прокрутки. Я попробовал этот быстрый тест, и он позволил мне прокрутить содержимое холста.

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

edit: Вот пример, где полосы прокрутки отображаются только при необходимости и динамически изменяются при изменении размера холста.

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

В этом примере я начинаю без полос прокрутки, и когда я нажимаю кнопку, чтобы развернуть холст, появляются полосы прокрутки.

2 голосов
/ 14 мая 2010

Хорошо, поработав с ним некоторое время, я придумал способ.Создайте 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);
    }
    

Надеюсь, это поможет.Пожалуйста, поделитесь, если у кого-нибудь есть идеи или предложения по улучшению этого.

0 голосов
/ 05 марта 2016

Объединив ответ Марио-Саннума и ваш вопрос, я нашел решение, которое в большинстве случаев должно работать нормально.

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

Это должно изменить размер холста, чтобы просмотрщик мог прокручивать ...

...