Так что я работаю в. NET Framework 4.7.2 и просто пытаюсь добавить полилинию к карте, основанной на MouseEvents, используя WPF. Я использую Bing Maps в качестве поставщика учетных данных (не должно иметь значения) и Microsoft.Maps.MapControl.WPF для фактического отображения и работы с картой (доступен пакет nuget).
Вот мой MainWindow.xaml:
<Window x:Class="MinimumReproducableMapControlBug.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<m:Map
x:Name="map"
CredentialsProvider="your_bing_maps_api_credentials"
MouseDown="map_MouseDown"
MouseMove="map_MouseMove"
/>
</Grid>
Вот мой MainWindow.xaml.cs
using Microsoft.Maps.MapControl.WPF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MinimumReproducableMapControlBug
{
public partial class MainWindow : Window
{
private Color _strokeColor;
private Color _fillColor;
private PointCollection _poly;
public MainWindow()
{
InitializeComponent();
_poly = new PointCollection();
_strokeColor = Colors.LightGreen;
_fillColor = Colors.LightGreen;
_fillColor.A = (byte)(255 / 2);
}
private void map_MouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
_poly.Add(e.GetPosition(this));
//convert _poly point collection into location collection
//so that the polyline can use it to display on the map
var polyLocations = new LocationCollection();
foreach (var viewportPoint in _poly)
{
polyLocations.Add(map.ViewportPointToLocation(viewportPoint));
}
var polyLine = new MapPolyline() { Locations = polyLocations };
polyLine.Stroke = new SolidColorBrush(_strokeColor);
polyLine.StrokeThickness = 2;
polyLine.Fill = new SolidColorBrush(_fillColor);
map.Children.Add(polyLine);
}
private void map_MouseMove(object sender, MouseEventArgs e)
{
e.Handled = true;
map.Children.Clear();
var polyLocations = new LocationCollection();
foreach (var viewportPoint in _poly)
{
polyLocations.Add(map.ViewportPointToLocation(viewportPoint));
}
if (polyLocations.Count == _poly.Count)
{
polyLocations.Add(map.ViewportPointToLocation(e.GetPosition(this)));
}
else
{
polyLocations[polyLocations.Count - 1] = map.ViewportPointToLocation(e.GetPosition(this));
}
var polyLine = new MapPolyline() { Locations = polyLocations };
polyLine.Stroke = new SolidColorBrush(_strokeColor);
polyLine.StrokeThickness = 2;
polyLine.Fill = new SolidColorBrush(_fillColor);
map.Children.Add(polyLine);
}
}
}
Проблема иногда в том, что мое событие щелчка срабатывает, а иногда нет. Интересно, что когда я нажимаю на карту влево или вправо (бесконечно прокручивается), он всегда ловит щелчок события и др aws поли в центральной карте.
Это я постоянно нажимаю на центральной карте, и только некоторые из событий щелчка действительно запускаются как задумано (событие щелчка определенно срабатывает всякий раз, когда к полилинии добавляется вершина): ![enter image description here](https://i.stack.imgur.com/HQZnk.gif)
Это я щелкаю от центра. Обратите внимание, что теперь записываются все мои события щелчка, и событие движения также работает правильно: ![enter image description here](https://i.stack.imgur.com/TxoZZ.gif)
Почему это похоже на мое событие перемещения блокирует событие нажатия кнопки мыши, когда я нажимаю на карту в центре?