如何在地图MouseMove事件上显示特征信息而没有任何闪烁?

时间:2019-04-24 11:24:47

标签: arcgis arcgis-runtime arcgis-runtime-net

我正在尝试在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事件的事情?。

或者对解决此问题的任何建议表示赞赏。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,您必须在每次鼠标移动事件时都非常小心。对每个鼠标移动执行一次命中测试将非常严重地影响CPU,并且您可能无法跟上非常频繁的鼠标移动。我建议您不要执行Hittest(如果已在进行中),并且一旦完成,就执行最新的mousemove事件(因为中间事件不再重要)。如果MapView.IsNavigating为true,则还应尝试避免执行识别(在移动地图时无需执行识别)。 通常,我们真的建议仅在单击时执行这些操作,而不是鼠标移动(取决于服务,这些操作可能是缓慢/长时间运行的操作)。

现在,如果您确实要在鼠标移动时执行此操作,我建议您仅在返回的功能是其他功能时才显示一个新的标注(使用对象ID来确定是否相同)或不)。因此,只有在功能第一次返回时才显示它,如果没有功能返回,则将关闭标注。