简体   繁体   English

WPF以编程方式在项目控件中滚动画布

[英]WPF Programatically scrolling a canvas in a items control

I have an ItemsControl that contains a canvas within a ScrollViewer . 我有一个ItemsControl ,其中包含ScrollViewer中的画布。 The canvas is large and only a portion of it displays at a time. 画布很大,一次只能显示一部分。 I want to programatically scroll it (the user clicks and drags the canvas to scroll). 我想以编程方式滚动它(用户单击并拖动画布进行滚动)。 I looked through the ScrollViewer methods and tried the following in the mouse event handlers: 我浏览了ScrollViewer方法,并在鼠标事件处理程序中尝试了以下方法:

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

However, this does nothing. 但是,这没有任何作用。 I checked the values of deltaX and deltaY and they are valid values (like 3, 5 etc.). 我检查了deltaX和deltaY的值,它们是有效值(例如3、5等)。 The HorizontalOffset and VerticalOffset remain 0 at all times, even after executing the above lines. 即使执行了上述几行后, HorizontalOffsetVerticalOffset始终保持为0。

Here is my XAML: 这是我的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>

Any help/suggestions is appreciated! 任何帮助/建议表示赞赏!

It works fine (ScrollViewer scrolls) in my test application: 在我的测试应用程序中,它工作正常(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>

and the code behind of: 以及以下代码:

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

Could you post some more details of the problem you are experiencing? 您能否发布您遇到的问题的更多详细信息?

Another potential solution...used for a TreeView, however don't see why the code should not work in your case: 另一个可能的解决方案...用于TreeView,但是看不到为什么代码在您的情况下不起作用:

Programmatically scrolling a TreeView 以编程方式滚动TreeView

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM