0

ユーザーがプッシュピンをドラッグしているときに、WPF Bing Maps コントロールがパンしないようにしようとしています。私がしていることは、ユーザーが MouseLeftButtonDown で画鋲を選択すると、マップ ViewChangeStart、ViewChangeOnFrame からイベントを引き継ぎ、e.Handled プロパティを true に設定することです。

私が期待していたのは、プロパティを true に設定すると、イベントがキャンセルされ、パンが無効になることです。ただし、マップはまだパンしています。

私が試した別のアプローチは、SupportedManipulations プロパティを None に設定することです。どちらのオプションも期待どおりの結果をもたらしません。

以下は、DraggablePushpin に使用しているコードです

 public class DraggablePushpin : Pushpin
    {
        private bool isDragging = false;

        protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
        {
            var parentLayer = this.Parent as MapLayer;
            if (parentLayer != null)
            {
                Map parentMap = parentLayer.Tag as Map;
                if (parentMap != null)
                {
                    parentMap.ViewChangeStart += parentMap_ViewChangeStart;
                    parentMap.MouseLeftButtonUp += parentMap_MouseLeftButtonUp;
                    parentMap.MouseMove += parentMap_MouseMove;

                    parentMap.SupportedManipulations = System.Windows.Input.Manipulations.Manipulations2D.None;
                }
            }

            this.isDragging = true;

            base.OnPreviewMouseLeftButtonDown(e);
        }

        protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
        }

        void parentMap_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            var map = sender as Map;
            // Check if the user is currently dragging the Pushpin
            if (this.isDragging)
            {
                // If so, the Move the Pushpin to where the Mouse is.
                var mouseMapPosition = e.GetPosition(map);
                var mouseGeocode = map.ViewportPointToLocation(mouseMapPosition);
                this.Location = mouseGeocode;
            }
        }

        void parentMap_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            (sender as Map).SupportedManipulations = System.Windows.Input.Manipulations.Manipulations2D.All;
        }

        protected override void OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e)
        {
            var parentLayer = this.Parent as MapLayer;
            if (parentLayer != null)
            {
                Map parentMap = parentLayer.Tag as Map;
                if (parentMap != null)
                {
                    parentMap.SupportedManipulations = System.Windows.Input.Manipulations.Manipulations2D.All;
                }
            }
        }

        void parentMap_ViewChangeStart(object sender, MapEventArgs e)
        {
            if (this.isDragging)
            {
                e.Handled = true;
            }
        }

    } 
4

0 に答える 0