我在ScrollViewer中有一个Canvas。我想让用户能够抓住画布并移动它,滚动条上的拇指正确更新。
我的初始实现计算每次鼠标移动的偏移量,并更新滚动条:
// Calculate the new drag distance
Point newOffsetPos = e.GetPosition(MapCanvas);
System.Diagnostics.Debug.WriteLine(" newOffsetPos : " + newOffsetPos.X + " " + newOffsetPos.Y);
double deltaX = newOffsetPos.X - _offsetPosition.X ;
double deltaY = newOffsetPos.Y - _offsetPosition.Y ;
System.Diagnostics.Debug.WriteLine(" delta X / Y : " + deltaX + " " + deltaY);
System.Diagnostics.Debug.WriteLine(" sv offsets X / Y : " + _scrollViewer.HorizontalOffset + " " + _scrollViewer.VerticalOffset);
_scrollViewer.ScrollToHorizontalOffset(_scrollViewer.HorizontalOffset - deltaX);
_scrollViewer.ScrollToVerticalOffset(_scrollViewer.VerticalOffset - deltaY);
_offsetPosition = newOffsetPos;
虽然这有效,但不是很顺利 有一个更好的方法吗?如果使用了变换,当移动画布时,滚动条是否会自动更新? 谢谢你的任何提示......
答案 0 :(得分:2)
实际上,这种问题实际上是使用正确的模式来跟踪鼠标。我在各种情况下都看到过这个问题,不仅仅是在Silverlight中。
最佳模式是捕获鼠标和主体的原始位置,然后从固定的原始值重新计算新的偏移量。这样,鼠标在平移图像上的单个点处保持固定。这是我简单的Repro: -
从Visual Studio中的全新Silverlight应用程序开始。修改MainPage.Xaml: -
<UserControl x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Background="White">
<ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Auto">
<Image x:Name="Map" Source="test.jpg" Width="1600" Height="1200" />
</ScrollViewer>
</Grid>
</UserControl>
将以下代码添加到MainPage.xaml.cs文件中: -
public MainPage()
{
InitializeComponent();
Map.MouseLeftButtonDown += new MouseButtonEventHandler(Map_MouseLeftButtonDown);
}
void Map_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point mapOrigin = new Point(Scroller.HorizontalOffset, Scroller.VerticalOffset);
Point mouseOrigin = e.GetPosition(Application.Current.RootVisual);
MouseEventHandler moveHandler = null;
MouseButtonEventHandler upHandler = null;
moveHandler = (s, args) =>
{
Point mouseNew = args.GetPosition(Application.Current.RootVisual);
Scroller.ScrollToHorizontalOffset(mapOrigin.X - (mouseNew.X - mouseOrigin.X));
Scroller.ScrollToVerticalOffset(mapOrigin.Y - (mouseNew.Y - mouseOrigin.Y));
};
upHandler = (s, args) =>
{
Scroller.MouseMove -= moveHandler;
Scroller.MouseLeftButtonUp -= upHandler;
};
Scroller.MouseMove += moveHandler;
Scroller.MouseLeftButtonUp += upHandler;
}
}
给它一个相当大的test.jpg(不需要1600x1200 Image
会缩放它。)
您会注意到,当拖动鼠标时,图像中的固定点将完全保留,直到您到达边界。尽可能快地移动鼠标,这是因为它不依赖于增量的准确性和最新性。唯一的变量是当前鼠标位置,其他值在鼠标按下时保持固定。
答案 1 :(得分:0)
您可以尝试this(或者至少看看它是如何实现的)。