LeftMouseUp не стреляет - Bing Maps MapPolyline - PullRequest
1 голос
/ 21 мая 2019

Я добавил MapPolyline на мою карту Bing.Однако карта, кажется, глотает только событие LeftMouseUp.Событие работает правильно для MouseDown и даже RightMouseUp, но не для LeftMouseUp.Для моего дизайна я должен использовать событие LeftMouseUp и не могу использовать другие.Почему событие не запускается, и как я могу это исправить?

public MainWindow()
{
    InitializeComponent();
    var testLine = new MapPolyline();
    var locations = new LocationCollection();
    locations.Add(new Location(50, 50));
    locations.Add(new Location(50, 60));
    locations.Add(new Location(50, 70));
    testLine.Locations = locations;
    testLine.Stroke = Brushes.Black;
    testLine.StrokeThickness = 15;
    testLine.PreviewMouseDown += ExampleHandlerDown;
    testLine.PreviewMouseUp += ExampleHandlerUp;
    MainMap.Children.Add(testLine);
}
private void ExampleHandlerDown(object sender, MouseEventArgs e)
{
    Console.WriteLine("Mouse Down");
}
private void ExampleHandlerUp(object sender, MouseEventArgs e)
{
    Console.WriteLine("Mouse Up");
}
<Window x:Class="StackQuestion.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="700" Width="1300">
<m:Map Name="MainMap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CredentialsProvider="My Credentials"/>
</Window>

Запуск кода приводит к следующим результатам: - Печать левой кнопкой мыши только при нажатии мыши - Печать правой кнопкой мыши«Mouse Down» и «Mouse Up» Левый щелчок мыши должен соответствовать поведению правого щелчка мыши.

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

вы должны сначала установить e.Handled = true; в вашей функции ExampleHandlerDown, чтобы она знала, что нужно вызвать MouseUp после обработанного события Down

private void ExampleHandlerDown(object sender, MouseEventArgs e)
{
    Console.WriteLine("Mouse Down");
    e.Handled = true;
}

Почему это работает?

Отсутствие обработки события нажатия мыши (особенно предварительного просмотра события мыши) приведет к тому, что событие нажатия мыши перейдет к следующему слою, который является картой; Это означает, что карта также получает событие мыши. Карта делает что-то подозрительное, когда появляется событие нажатия мыши, препятствующее работе мыши.

Добавьте это, чтобы понять, что я имею в виду

    MainMap.MouseDown += MainMap_MouseDown;
    MainMap.MouseUp += MainMap_MouseUp;

    private void MainMap_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Console.WriteLine("Map Mouse Up");
    }

    private void MainMap_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Console.WriteLine("Map Mouse Down <-- Something going on in here");
    }

Закомментируйте ваш e.Handled = true, и вы увидите это в этом выводе

Mouse Down
Map Mouse Down <-- Something going on in here
Map Mouse Up

Вставьте e.Handled = true строку обратно, и вы увидите этот вывод

Mouse Down
Mouse Up
Map Mouse Up

Таким образом, вы увидите, что любые необработанные события передаются на карту. Вероятно, вам следует обработать событие мыши, чтобы карта не делала странных вещей, которые вам тоже не нужны. Я думаю, это не делает ничего подозрительного, если щелкнуть правой кнопкой мыши. Вам нужно будет увидеть источник карт bing, чтобы увидеть, что он на самом деле делает

1 голос
/ 21 мая 2019

Как вы правильно заявили, какой-то компонент блокирует событие для обработки там, где вы хотите. Это потому, что вы используете событие bubbling (MouseDown). WPF предлагает вариант PreviewMouseDown, который представляет собой событие tunneling . Вы можете прочитать больше о различиях между здесь .

По сути, все сводится к тому, что всплывающие события обрабатываются в порядке, начиная с исходного элемента, идущего вверх по визуальному дереву через каждый родительский элемент. Туннельные события противоположны - они начинаются с элемента, который находится выше в визуальном дереве, и движутся к тому, что его вызвало. Это фактически означает, что все, что блокирует событие от достижения нужного обработчика, будет обойдено, когда вы используете событие туннелирования, потому что вы приближаетесь к нему с другого направления.

...