C# LeftMouseUp未触发-Bing映射映射多段线

C# LeftMouseUp未触发-Bing映射映射多段线,c#,wpf,bing-maps,C#,Wpf,Bing Maps,我已经在Bing地图中添加了一条地图多段线。然而,地图似乎只吞没了LeftMouseUp事件。该事件适用于MouseDown甚至RightMouseUp,但不适用于LeftMouseUp。对于我的设计,我必须使用LeftMouseUp事件,不能使用其他事件。为什么事件没有触发,我如何修复它 public MainWindow() { InitializeComponent(); var testLine = new MapPolyline(); var locations

我已经在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");
}

运行代码会产生以下结果: -鼠标左键单击仅打印“鼠标按下” -鼠标右键单击可打印“鼠标下移”和“鼠标上移”
鼠标左键单击应该与鼠标右键单击行为相匹配。

正如您正确指出的,某些组件正在阻止事件在您希望的位置进行处理。这是因为您正在使用冒泡事件(MouseDown)。WPF提供了一个变体PreviewMouseDown,它是一个隧道事件。您可以阅读更多关于两者之间差异的信息


基本上可以归结为,冒泡事件的处理顺序是从源元素向上到可视化树,再到每个父元素。隧道事件则相反——它们从视觉树中最高的元素开始,并向激发它的任何元素移动。这实际上意味着,当您使用隧道事件时,任何阻止事件到达您想要的处理程序的东西都将被绕过,因为您是从不同的方向到达它的。

正如您正确地指出的,某些组件阻止事件在您想要的地方处理。这是因为您正在使用冒泡事件(MouseDown)。WPF提供了一个变体PreviewMouseDown,它是一个隧道事件。您可以阅读更多关于两者之间差异的信息


基本上可以归结为,冒泡事件的处理顺序是从源元素向上到可视化树,再到每个父元素。隧道事件则相反——它们从视觉树中最高的元素开始,并向激发它的任何元素移动。这实际上意味着,当您使用隧道事件时,任何阻止事件到达您想要的处理程序的东西都将被绕过,因为您是从不同的方向到达它的。

您必须设置
e.Handled=trueExampleHandlerDown
函数中选择code>,以便它知道在处理掉事件后调用MouseUp

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
行放回,您将看到此输出


因此,您将看到任何未处理的事件正在传递到映射。您可能也应该处理鼠标上升事件,以防止地图做任何您不想做的奇怪事情。我猜它不会做任何可疑的事,当它是一个右键点击。您需要查看bing地图的源代码,才能查看它的实际功能

您必须设置
e.Handled=trueExampleHandlerDown
函数中选择code>,以便它知道在处理掉事件后调用MouseUp

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
行放回,您将看到此输出


因此,您将看到任何未处理的事件正在传递到映射。您可能也应该处理鼠标上升事件,以防止地图做任何您不想做的奇怪事情。我猜它不会做任何可疑的事,当它是一个右键点击。你需要查看bing地图的源代码才能看到它实际在做什么

尝试使用PreviewMouseUp/Down。我刚刚使用了,结果相同。尝试使用PreviewMouseUp/Down。我刚刚使用了,结果相同。不幸的是,在处理预览事件时也会发生同样的情况。我现在更新了问题中的代码以反映这一点。不幸的是,当我处理预览事件时也会发生同样的情况。我现在更新了问题中的代码以反映这一点。这非常有效。两个问题。1.为什么这样做有效,以及2。为什么右键向下没有这个功能,而左键没有?我唯一的猜测是bing地图正在用左键处理鼠标向上移动事件。也许是地图上的错误。在地图上添加一个鼠标向上处理程序,你就会明白我的意思,也就是说,除非你处理鼠标向下事件,否则它将启动,而行mouseup不会启动。因此,向下操作鼠标可以防止地图做一些您不希望它做的事情,例如在直线上失去焦点。我将更新答案以反映。这非常有效。两个问题。1.为什么这样做有效,以及2。为什么右键向下没有这个功能,而左键没有?我唯一的猜测是bing地图正在用左键处理鼠标向上移动事件。也许是地图上的错误。在地图上添加一个鼠标向上处理程序,你就会明白我的意思,也就是说,除非你处理鼠标向下事件,否则它将启动,而行mouseup不会启动。因此,向下操作鼠标可以防止地图做一些您不希望它做的事情,例如在直线上失去焦点。我会更新答案以反映。
Mouse Down
Mouse Up
Map Mouse Up