WPF Программная прокрутка холста в элементе управления элементами - PullRequest
2 голосов
/ 04 октября 2010

У меня есть ItemsControl, который содержит холст внутри ScrollViewer.Холст большой, и за один раз отображается только его часть.Я хочу программно прокрутить его (пользователь нажимает и перетаскивает холст для прокрутки).Я просмотрел методы ScrollViewer и попробовал следующее в обработчиках событий мыши:

var scrollViewer = (sender) as ScrollViewer;
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);

Однако это ничего не делает.Я проверил значения deltaX и deltaY, и они являются действительными значениями (например, 3, 5 и т. Д.).HorizontalOffset и VerticalOffset остаются 0 всегда, даже после выполнения вышеуказанных строк.

Вот мой XAML:

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
              MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove"
              PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent">
        <ItemsControl ItemsSource="{Binding BubbleVMCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                   <!-- My template here -->
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" />
                    <Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
</ScrollViewer>

Любая помощь / предложения приветствуются!

Ответы [ 2 ]

1 голос
/ 04 октября 2010

Он отлично работает (прокрутка ScrollViewer) в моем тестовом приложении:

<ScrollViewer Name="scrollViewer"
        VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
          MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove"
          PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent">
        <ItemsControl ItemsSource="{Binding BubbleVMCollection}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas Width="5000" Height="5000"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <!-- My template here -->
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" />
                    <Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    </ScrollViewer>

и код:

Point capturePoint { get; set; }

    private void ScrollViewer_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
        scrollViewer.CaptureMouse();
        capturePoint = e.MouseDevice.GetPosition(scrollViewer);
    }

    private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) {
        scrollViewer.ReleaseMouseCapture();
    }

    private void ScrollViewer_MouseMove(object sender, MouseEventArgs e) {
        if (!scrollViewer.IsMouseCaptured) return;
        Point currentPoint = e.MouseDevice.GetPosition(scrollViewer);
        var deltaX = capturePoint.X - currentPoint.X;
        var deltaY = capturePoint.Y - currentPoint.Y;
        scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
        scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);
    }

Не могли бы вы опубликовать более подробную информацию о проблемепереживает?

0 голосов
/ 04 октября 2010

Другое потенциальное решение ... используется для TreeView, однако не понимаю, почему код не должен работать в вашем случае:

Программная прокрутка TreeView

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