我正在尝试在mousemove事件上使用ShowCalloutAt API函数在弹出窗口中显示选定的功能信息。 使用以下代码:
public class TestMouseMove
{
public TestMouseMove(MapView mapView)
{
mapView.MouseMove+=MouseMove_Event;
}
private void MouseMove_Event(object sender, MouseEventArgs e)
{
var screenPoint = new MapPoint (e.Location.X, e.Location.Y,
EsriMapView.SpatialReference);
var mapPoint = (MapPoint)GeometryEngine.Project (screenPoint, SpatialReferences.Wgs84);
Feature selectedFeature=null;
//I have written logic to Filter and take the single feature of top layer under mouse pointer
selectedFeature=GetFeatureUnderMousePointer();
//Now I am calling callout at the selected point using below code
CalloutDefinition myCalloutDefinition = new CalloutDefinition("Testing message");
// Display the callout
MyMapView.ShowCalloutAt(mapPoint , myCalloutDefinition);
}
private GetFeatureUnderMousePointer()
{
//Logic to filter and ge feature under mouse pointer
}
}
但是,如果在多边形要素内移动鼠标指针,则在鼠标移动时会多次显示ShowCAllout弹出窗口。 结果,弹出窗口似乎闪烁了。因此,有没有更好的方法来实现类似mousemovestop事件的事情?。
或者对解决此问题的任何建议表示赞赏。
谢谢。
答案 0 :(得分:1)
首先,您必须在每次鼠标移动事件时都非常小心。对每个鼠标移动执行一次命中测试将非常严重地影响CPU,并且您可能无法跟上非常频繁的鼠标移动。我建议您不要执行Hittest(如果已在进行中),并且一旦完成,就执行最新的mousemove事件(因为中间事件不再重要)。如果MapView.IsNavigating为true,则还应尝试避免执行识别(在移动地图时无需执行识别)。 通常,我们真的建议仅在单击时执行这些操作,而不是鼠标移动(取决于服务,这些操作可能是缓慢/长时间运行的操作)。
现在,如果您确实要在鼠标移动时执行此操作,我建议您仅在返回的功能是其他功能时才显示一个新的标注(使用对象ID来确定是否相同)或不)。因此,只有在功能第一次返回时才显示它,如果没有功能返回,则将关闭标注。