C#Windows 8手机地图禁用缩放和滚动

C#Windows 8手机地图禁用缩放和滚动,c#,windows-phone-8,maps,scroll,zooming,C#,Windows Phone 8,Maps,Scroll,Zooming,我目前正在Windows 8 Phone应用程序中使用Microsoft.Phone.Map,希望能够停止更改缩放级别和在地图上移动(滚动)的交互 我尝试过禁用交互,但问题是我有一个层,其中有一些兴趣点需要被挖掘以扩展信息,当我使用IsEnabled=True禁用地图时,这些信息不起作用 缩放级别设置为this.BigMap.ZoomLevel=16开始,然后尝试通过交互阻止此更改,我执行了以下操作: void BigMap_ZoomLevelChanged(object sender, Map

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

我尝试过禁用交互,但问题是我有一个层,其中有一些兴趣点需要被挖掘以扩展信息,当我使用
IsEnabled=True禁用地图时,这些信息不起作用

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

void BigMap_ZoomLevelChanged(object sender, MapZoomLevelChangedEventArgs e)
    {
        this.BigMap.ZoomLevel = 16;
    }
但这意味着我得到了一个相当跳跃的效果-有没有更好的方法来禁用缩放


还有人知道如何阻止地图移动吗?我只想让屏幕上合适的部分保持不变,而不让用户移动它

您可以找到地图元素的栅格,并停止其缩放和移动操作,如下所示:

xaml:


政务司司长:

private void Map_加载(对象发送方,路由目标)
{
Grid Grid=FindChildOfType(MyMap);
grid.ManipulationCompleted+=映射_ManipulationCompleted;
grid.manufactionDelta+=映射_manufactionDelta;
}
私有void映射_操纵delta(对象发送方,操纵deltaeventargs e)
{
//禁用缩放
如果(e.DeltaManipulation.Scale.X!=0.0||
e、 DeltaManipulation.Scale.Y!=0.0)
e、 已处理=正确;
//禁止移动
if(e.DeltaManipulation.Translation.X!=0.0||
e、 DeltaManipulation.Translation.Y!=0.0)
e、 已处理=正确;
}
私有void映射\u操作已完成(对象发送方,操作已完成事件参数e)
{
//禁用缩放
如果(e.FinalVelocities.ExpansionVelocity.X!=0.0||
e、 最终位置.扩展速度.Y!=0.0)
e、 已处理=正确;
//禁止移动
如果(e.finalvelocity.LinearVelocity.X!=0.0||
e、 finalvelocity.LinearVelocity.Y!=0.0)
{
e、 已处理=正确;
}
}
公共静态T FindChildOfType(DependencyObject根),其中T:class
{
var queue=新队列();
queue.Enqueue(root);
而(queue.Count>0)
{
DependencyObject当前=queue.Dequeue();

对于(int i=VisualTreeHelper.GetChildrenCount(current)-1;0 WAG:
IshittesVisible=“false”
应关闭地图上的命中测试,这将关闭与它的所有用户交互。如果我这样做
IshittesVisible=“false”
on my hold事件,即当我需要地图锁定时,如何让它识别手指不再出现在屏幕上。我需要某种类型的事件处理程序,然后可以设置'ishitsetvisible=true'“因此,交互是正常的。事实上,如果你永远不能滚动/缩放,地图只能识别按住和点击事件,那就更好了。在它上面放置另一个透明的控件。让该控件成为交互的目标,并做需要做的事(不知道是什么)到基础地图控件。很好,Will先生,IshittesVisible…要锁定/解锁地图,很好。
<Grid x:Name="LayoutRoot">
    <maps:Map ZoomLevel="10"
              x:Name="MyMap"
              Loaded="Map_Loaded"
              Tap="MyMap_Tap"/>
</Grid>
    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
    }