LeftMouseUp 未触发 - Bing 地图 MapPolyline
LeftMouseUp not firing - Bing Maps MapPolyline
我已将 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 Down" 和 "Mouse Up"
鼠标左键单击应与鼠标右键单击行为相匹配。
如您正确所述,某些组件正在阻止事件处理您想要的位置。这是因为您正在使用 冒泡 事件 (MouseDown)。 WPF 提供了一个变体 PreviewMouseDown,它是一个 tunneling 事件。您可以阅读更多关于两者之间差异的信息 here.
基本上可以归结为,冒泡事件的处理顺序是从源元素开始,通过每个父元素在可视化树中向上移动。隧道事件恰恰相反——它们从可视化树中最高的元素开始,并向任何触发它的元素移动。这实际上意味着当您使用隧道事件时,无论什么阻止事件到达您想要的处理程序都将被绕过,因为您是从不同的方向来的。
您必须先在 ExampleHandlerDown
函数中设置 e.Handled = true;
,以便它知道在处理 Down 事件后调用 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
,你会在这个输出中看到这个
Mouse Down
Map Mouse Down <-- Something going on in here
Map Mouse Up
把你的 e.Handled = true
线放回去你会看到这个输出
Mouse Down
Mouse Up
Map Mouse Up
所以您会看到所有未处理的事件都被传递到地图。您可能也应该处理鼠标弹起事件,以防止地图做任何您不想要的奇怪事情。我猜它在右键单击时不会做任何可疑的事情。您需要查看 bing 地图的来源才能了解它的实际作用
我已将 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 Down" 和 "Mouse Up" 鼠标左键单击应与鼠标右键单击行为相匹配。
如您正确所述,某些组件正在阻止事件处理您想要的位置。这是因为您正在使用 冒泡 事件 (MouseDown)。 WPF 提供了一个变体 PreviewMouseDown,它是一个 tunneling 事件。您可以阅读更多关于两者之间差异的信息 here.
基本上可以归结为,冒泡事件的处理顺序是从源元素开始,通过每个父元素在可视化树中向上移动。隧道事件恰恰相反——它们从可视化树中最高的元素开始,并向任何触发它的元素移动。这实际上意味着当您使用隧道事件时,无论什么阻止事件到达您想要的处理程序都将被绕过,因为您是从不同的方向来的。
您必须先在 ExampleHandlerDown
函数中设置 e.Handled = true;
,以便它知道在处理 Down 事件后调用 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
,你会在这个输出中看到这个
Mouse Down Map Mouse Down <-- Something going on in here Map Mouse Up
把你的 e.Handled = true
线放回去你会看到这个输出
Mouse Down Mouse Up Map Mouse Up
所以您会看到所有未处理的事件都被传递到地图。您可能也应该处理鼠标弹起事件,以防止地图做任何您不想要的奇怪事情。我猜它在右键单击时不会做任何可疑的事情。您需要查看 bing 地图的来源才能了解它的实际作用