Microsoft.Maps.MapControl.WPF MouseMove, кажется, блокирует событие MouseDown - PullRequest
0 голосов
/ 03 марта 2020

Так что я работаю в. 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

Это я щелкаю от центра. Обратите внимание, что теперь записываются все мои события щелчка, и событие движения также работает правильно: enter image description here

Почему это похоже на мое событие перемещения блокирует событие нажатия кнопки мыши, когда я нажимаю на карту в центре?

1 Ответ

0 голосов
/ 03 марта 2020

ИСПРАВЛЕНО, если не быть глупым и создавать новый MapPolyline при каждом движении! Изменить: OG ответ в комментариях к вопросу

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;
        private LocationCollection _polyLocations;
        private MapPolyline _polyLine;

        public MainWindow()
        {
            InitializeComponent();
            _poly = new PointCollection();
            _polyLocations = new LocationCollection();
            _polyLine = new MapPolyline();
            _strokeColor = Colors.LightGreen;
            _fillColor = Colors.LightGreen;
            _fillColor.A = (byte)(255 / 2);

            _polyLine.Stroke = new SolidColorBrush(_strokeColor);
            _polyLine.StrokeThickness = 2;
            _polyLine.Fill = new SolidColorBrush(_fillColor);
        }

        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
            _polyLocations.Clear();
            foreach (var viewportPoint in _poly)
            {
                _polyLocations.Add(map.ViewportPointToLocation(viewportPoint));
            }

            _polyLine.Locations = _polyLocations;
            if (!map.Children.Contains(_polyLine))
            {
                map.Children.Add(_polyLine);
            } 
        }

        private void map_MouseMove(object sender, MouseEventArgs e)
        {
            e.Handled = true;
            map.Children.Clear();
            _polyLocations.Clear();
            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));
            }

            _polyLine.Locations = _polyLocations;
            if (!map.Children.Contains(_polyLine))
            {
                map.Children.Add(_polyLine);
            }
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...