微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Draggable Pushpins using Bing Maps Silverlight Control

Using a map to visualize data within an application is great,but you must first get the location of the data to be displayed. If you have the address you can geocode it using the Bing Maps Web Services,but "What if you can't geocode it?" Or,"What if the geocoding can't find the address?" Well,if your user kNows where the location is,then you can have them point it out by clicking on the map. Creating pushpins in response to a users click is nice,but wouldn't it be even nicer if they Could "Click and Drag" the pushpin around to define/edit/change the location of the data entity?

I have even seen this discussed a bit in regards to the Bing Maps Silverlight Control,and it isn't something that is built into the map control directly. However it isn't too difficult to implement,if you kNow what to do. So I decided to create and post a simple "Draggablepushpin" object deriving from the "Microsoft.Maps.MapControl.pushpin" object that implements Dragging in a nice,self contained fashion. There's no need to wire up any events,you simple add a "Draggablepushpin" to you Map,and the user can drag it around.

Here's the code for the "Draggablepushpin":

public class Draggablepushpin : Microsoft.Maps.MapControl.pushpin
{
    private bool isDragging = false;
    EventHandler<MapMouseDragEventArgs> ParentMapMousePanHandler;
    MouseButtonEventHandler ParentMapMouseLeftButtonUpHandler;
    MouseEventHandler ParentMapMouseMoveHandler;

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        // Check if the Map Event Handlers have been created/attached to the Map
        // If not,then attach them. This is done in the "pushpin.OnMouseLeftButtonDown"
        // event because we don't kNow when the pushpin is added to a Map or MapLayer,but
        // we do konw that when this event is fired the pushpin will already have been added.
        var parentLayer = this.Parent as MapLayer;
        if (parentLayer != null)
        {
            var parentMap = parentLayer.ParentMap;
            if (parentMap != null)
            {
                if (this.ParentMapMousePanHandler == null)
                {
                    this.ParentMapMousePanHandler = new EventHandler<MapMouseDragEventArgs>(ParentMap_MousePan);
                    parentMap.MousePan += this.ParentMapMousePanHandler;
                }
                if (this.ParentMapMouseLeftButtonUpHandler == null)
                {
                    this.ParentMapMouseLeftButtonUpHandler = new MouseButtonEventHandler(ParentMap_MouseLeftButtonUp);
                    parentMap.MouseLeftButtonUp += this.ParentMapMouseLeftButtonUpHandler;
                }
                if (this.ParentMapMouseMoveHandler == null)
                {
                    this.ParentMapMouseMoveHandler = new MouseEventHandler(ParentMap_MouseMove);
                    parentMap.MouseMove += this.ParentMapMouseMoveHandler;
                }
            }
        }

        // Enable Dragging
        this.isDragging = true;

        base.OnMouseLeftButtonDown(e);
    }

    #region "Mouse Event Handler Methods"

    void ParentMap_MousePan(object sender,MapMouseDragEventArgs e)
    {
        // If the pushpin is being dragged,specify that the Map's MousePan
        // event is handled. This is to suppress the Panning of the Map that
        // is done when the mouse drags the map.
        if (this.isDragging)
        {
            e.Handled = true;
        }
    }

    void ParentMap_MouseLeftButtonUp(object sender,MouseButtonEventArgs e)
    {
        // Left Mouse Button released,stop dragging the pushpin
        this.isDragging = false;
    }

    void ParentMap_MouseMove(object sender,MouseEventArgs e)
    {
        var map = sender as Microsoft.Maps.MapControl.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;
        }
    }

    #endregion
}

转自:http://pietschsoft.com/post/2010/05/30/Draggable-Pushpins-using-Bing-Maps-Silverlight-Control.aspx

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐