Silverlight应用程序中的平移到平移

时间:2010-02-01 19:00:16

标签: silverlight

我在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;

虽然这有效,但不是很顺利 有一个更好的方法吗?如果使用了变换,当移动画布时,滚动条是否会自动更新? 谢谢你的任何提示......

2 个答案:

答案 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(或者至少看看它是如何实现的)。