C#Windows 8电话地图禁用缩放和滚动

时间:2013-10-01 16:44:19

标签: c# windows-phone-8 maps scroll zoom

我目前在Windows 8 Phone应用程序中使用Microsoft.Phone.Map,希望能够停止交互以更改缩放级别并在地图上移动(滚动)。

我尝试过禁用互动,但问题是我有一个需要利用兴趣点的图层来扩展当我使用IsEnabled = True;停用地图时不起作用的信息

缩放级别设置为this.BigMap.ZoomLevel = 16;以开始,然后尝试通过交互更改来阻止此操作:

void BigMap_ZoomLevelChanged(object sender, MapZoomLevelChangedEventArgs e)
    {
        this.BigMap.ZoomLevel = 16;
    }

但这意味着我得到一个相当跳跃的效果 - 是否有更好的方法来禁用缩放?

有没有人知道如何阻止地图移动 - 我只想让屏幕上的部分保持不变并且不让用户移动它。

1 个答案:

答案 0 :(得分:0)

您可以找到地图元素的网格,并停止它的缩放和移动操作:

XAML:

<Grid x:Name="LayoutRoot">
    <maps:Map ZoomLevel="10"
              x:Name="MyMap"
              Loaded="Map_Loaded"
              Tap="MyMap_Tap"/>
</Grid>

CS:

    private void Map_Loaded(object sender, RoutedEventArgs e)
    {
        Grid grid = FindChildOfType<Grid>(MyMap);
        grid.ManipulationCompleted += Map_ManipulationCompleted;
        grid.ManipulationDelta += Map_ManipulationDelta;
    }

    private void Map_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        // disable zoom
        if (e.DeltaManipulation.Scale.X != 0.0 ||
            e.DeltaManipulation.Scale.Y != 0.0)
            e.Handled = true;

        //disable moving
        if (e.DeltaManipulation.Translation.X != 0.0 ||
            e.DeltaManipulation.Translation.Y != 0.0)
            e.Handled = true;
    }

    private void Map_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        // disable zoom
        if (e.FinalVelocities.ExpansionVelocity.X != 0.0 ||
            e.FinalVelocities.ExpansionVelocity.Y != 0.0)
            e.Handled = true;

        //disable moving
        if (e.FinalVelocities.LinearVelocity.X != 0.0 ||
            e.FinalVelocities.LinearVelocity.Y != 0.0)
        {
            e.Handled = true;
        }
    }

    public static T FindChildOfType<T>(DependencyObject root) where T : class
    {
        var queue = new Queue<DependencyObject>();
        queue.Enqueue(root);

        while (queue.Count > 0)
        {
            DependencyObject current = queue.Dequeue();
            for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
            {
                var child = VisualTreeHelper.GetChild(current, i);
                var typedChild = child as T;
                if (typedChild != null)
                {
                    return typedChild;
                }
                queue.Enqueue(child);
            }
        }
        return null;
    }

    private void MyMap_Tap(object sender, GestureEventArgs e)
    {
        //This is still working
    }

因为您只禁用缩放和移动操作,所以点击和保持正常工作。

希望这有帮助!

编辑:请注意,当您调用FindChildOfType(MyMap)时,地图元素应该是可见的。