Здравствуйте!
Создал Win Forms приложение, подключил библиотеку GMap.NET для работы с картами, такой код:
Код:
using GMap.NET.WindowsForms;
using System;
using System.Linq;
using System.Windows.Forms;
namespace Google_Maps_and_Gmap
{
public partial class FormMain : Form
{
//выбранный маркер
private GMapMarker _selectedMarker;
public FormMain()
{
InitializeComponent();
this.Load += FormMain_Load;
//подписка на события мыши
_gMapControl.MouseUp += _gMapControl_MouseUp;
_gMapControl.MouseDown += _gMapControl_MouseDown;
}
private void FormMain_Load(object sender, EventArgs e)
{
//Настройки для компонента GMap.
_gMapControl.Bearing = 0;
//CanDragMap - Если параметр установлен в True,
//пользователь может перетаскивать карту
///с помощью правой кнопки мыши.
_gMapControl.CanDragMap = true;
//Указываем что перетаскивание карты осуществляется
//с использованием левой клавишей мыши.
//По умолчанию - правая.
_gMapControl.DragButton = MouseButtons.Left;
_gMapControl.GrayScaleMode = true;
//MarkersEnabled - Если параметр установлен в True,
//любые маркеры, заданные вручную будет показаны.
//Если нет, они не появятся.
_gMapControl.MarkersEnabled = true;
//Указываем значение максимального приближения.
_gMapControl.MaxZoom = 18;
//Указываем значение минимального приближения.
_gMapControl.MinZoom = 2;
//Устанавливаем центр приближения/удаления
//курсор мыши.
_gMapControl.MouseWheelZoomType =
GMap.NET.MouseWheelZoomType.MousePositionAndCenter;
//Отказываемся от негативного режима.
_gMapControl.NegativeMode = false;
//Разрешаем полигоны.
_gMapControl.PolygonsEnabled = true;
//Разрешаем маршруты.
_gMapControl.RoutesEnabled = true;
//Скрываем внешнюю сетку карты
//с заголовками.
_gMapControl.ShowTileGridLines = false;
//Указываем, что при загрузке карты будет использоваться
//18ти кратной приближение.
_gMapControl.Zoom = 18;
//Указываем, что все края элемента управления
//закрепляются у краев содержащего его элемента
//управления(главной формы), а их размеры изменяются
//соответствующим образом.
_gMapControl.Dock = DockStyle.Fill;
//Указываем, что будем использовать карты Google.
_gMapControl.MapProvider =
GMap.NET.MapProviders.GMapProviders.GoogleMap;
GMap.NET.GMaps.Instance.Mode =
GMap.NET.AccessMode.ServerOnly;
//Если вы используете интернет через прокси сервер,
//указываем свои учетные данные.
GMap.NET.MapProviders.GMapProvider.WebProxy =
System.Net.WebRequest.GetSystemWebProxy();
GMap.NET.MapProviders.GMapProvider.WebProxy.Credentials =
System.Net.CredentialCache.DefaultCredentials;
//Указываем элементу управления,
//что необходимо при открытии карты прейти по
//координатам красной площади в Москве.
_gMapControl.Position = new GMap.NET.PointLatLng(55.75393, 37.620795);
//Создаем новый список маркеров, с указанием компонента
//в котором они будут использоваться и названием списка.
GMap.NET.WindowsForms.GMapOverlay markersOverlay =
new GMap.NET.WindowsForms.GMapOverlay(_gMapControl, "marker");
//Инициализация нового ЗЕЛЕНОГО маркера, с указанием его координат.
GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen markerG =
new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(
//Указываем координаты Красной площади
new GMap.NET.PointLatLng(55.75393, 37.620795));
markerG.ToolTip =
new GMap.NET.WindowsForms.ToolTips.GMapRoundedToolTip(markerG);
//Текст отображаемый при наведении на маркер.
markerG.ToolTipText = "Красная площадь";
markerG.Tag = 1;
//Инициализация нового КРАСНОГО маркера, с указанием его координат.
GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed markerR =
new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed(
//Указываем координаты Красной площади
new GMap.NET.PointLatLng(55.75393, 37.620695));
markerR.ToolTip =
new GMap.NET.WindowsForms.ToolTips.GMapBaloonToolTip(markerG);
//Текст отображаемый при наведении на маркер.
markerR.ToolTipText = "Красная площадь";
markerR.Tag = 2;
//Добавляем маркеры в список маркеров.
//Зеленый маркер
markersOverlay.Markers.Add(markerG);
//Красный маркет
markersOverlay.Markers.Add(markerR);
//Добавляем в компонент, список маркеров.
_gMapControl.Overlays.Add(markersOverlay);
}
private void _gMapControl_MouseDown(object sender, MouseEventArgs e)
{
// находим тот маркер над которым нажали клавишу мыши
_selectedMarker = _gMapControl.Overlays
.SelectMany(o => o.Markers)
.FirstOrDefault(m => m.IsMouseOver == true);
}
private void _gMapControl_MouseUp(object sender, MouseEventArgs e)
{
if (_selectedMarker is null)
return;
// переводим координаты курсора мыши в долготу и широту на карте
var latlng = _gMapControl.FromLocalToLatLng(e.X, e.Y);
// присваиваем новую позицию для маркера
_selectedMarker.Position = latlng;
_selectedMarker = null;
}
}
}
При запуске приложения создается два маркера на карте:
1 .jpg
При первом перетаскивании маркера он дублируется, одна копия остается на старом месте, другая копия перемещается в новое место, получается вместо 2-х маркеров становится 4:
2 .jpg
Причем при отладке, когда точка останова стоит на методе _gMapControl_MouseDown, я заметил, что в метод _gMapControl_MouseDown и _gMapControl_MouseUp происходит вход 2 раза подряд. Подскажите, почему так происходит?