1

現在Microsoft.Phone.Map、Windows 8 Phone アプリで を使用しており、ズーム レベルの変更やマップ内の移動 (スクロール) の操作を停止できるようにしたいと考えています。

インタラクションを無効にしようとしましたが、問題は、マップを無効にすると機能しない情報を展開するためにタップする必要がある興味のあるポイントを持つレイヤーがあることですIsEnabled = True;

ズームレベルは、最初からに設定されthis.BigMap.ZoomLevel = 16;ており、インタラクションでこれが変化しないようにするために、次のようにしました。

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

しかし、それは私がかなりびくびくした効果を得ることを意味します - ズームを無効にするより良い方法はありますか?

また、マップの移動を停止する方法を知っている人はいますか? 画面に収まるセクションだけをそのままにして、ユーザーが動かないようにしたいのです。

4

1 に答える 1

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) を呼び出すと、マップ要素が表示される必要があることに注意してください。

于 2014-07-18T11:13:19.500 に答える