0

我试图在 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 弹出窗口会在 mousemove 上多次出现。结果,弹出窗口看起来像是在闪烁。那么,有没有更好的方法来实现类似 on mousemovestop 事件?

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

提前致谢。

4

1 回答 1

1

首先,您必须非常小心地在每个鼠标移动事件上执行此操作。对每次鼠标移动执行一次命中测试会对 CPU 造成很大的冲击,并且您可能无法跟上非常频繁的鼠标移动。如果一个已经在处理中,我建议你不要执行一个命中测试,一旦完成,你执行任何最新的 mousemove 事件(因为中间事件不再重要)。如果 MapView.IsNavigating 为真,您还应该尝试避免执行识别(在移动地图时无需执行识别)。一般来说,我们真的建议只在点击时执行这些操作,而不是鼠标移动(取决于服务,这些操作可能相当缓慢/长时间运行)。

现在针对您的具体问题,如果您真的想在鼠标移动时执行此操作,我建议您仅在返回的功能是不同功能时才显示新标注(使用对象 ID 来识别它是否相同) . 因此,您只会在功能第一次返回时显示它,如果没有功能返回,您将关闭标注。

于 2019-04-30T18:58:10.320 回答