WPF以编程方式在项目控件中滚动画布 [英] WPF Programatically scrolling a canvas in a items control
问题描述
我有一个 ItemsControl
,它在 ScrollViewer
中包含一个画布。画布很大,一次只能显示一部分。我想以编程方式滚动它(用户单击并拖动画布进行滚动)。我浏览了ScrollViewer方法,并在鼠标事件处理程序中尝试了以下操作:
I have an ItemsControl
that contains a canvas within a 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:
var scrollViewer = (sender) as ScrollViewer;
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);
但是,这没有任何作用。我检查了deltaX和deltaY的值,它们是有效值(例如3、5等)。即使在执行上述行之后, HorizontalOffset
和 VerticalOffset
始终保持为0。
However, this does nothing. I checked the values of deltaX and deltaY and they are valid values (like 3, 5 etc.). The HorizontalOffset
and VerticalOffset
remain 0 at all times, even after executing the above lines.
这是我的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>
感谢任何帮助/建议!
推荐答案
在我的测试应用程序中正常运行(ScrollViewer滚动):
It works fine (ScrollViewer scrolls) in my test application:
<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);
}
您能否发布您遇到的问题的更多详细信息?
Could you post some more details of the problem you are experiencing?
这篇关于WPF以编程方式在项目控件中滚动画布的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!