绘制图形后刷新视图的最佳方法是什么?


9

我在单击按钮时绘制了一个多边形以突出显示一个特征。然后,我需要刷新ActiveView以显示新的多边形。这行有效:

mapControl.ActiveView.ScreenDisplay.StartDrawing(StartDrawing(mapControl.ActiveView.ScreenDisplay.hDC, (System.Int16)ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache);
mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
mapControl.ActiveView.ScreenDisplay.FinishDrawing();
mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, feature.Extent, null);

但是它总是重新加载每一层。我尝试了几乎所有PartialRefresh与其他对象调用的方法,esriViewDrawPhase但是没有一种方法显示新的多边形。

有比重绘更好的解决方案esriViewDrawPhase.esriViewAll吗?

更新资料

我用了一个ILayerExtensionDraw.AfterDraw测试阶段抽签和AfterDraw只被击中了PartialRefresh()esriViewAll。该扩展已添加到MapControl.Layers中的所有图层。我希望它每次都会受到打击?在哪一层上mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);绘制,以使AfterDraw甚至不凸起?

回答

多亏了Kirk,这才是解决方案,它无需重新加载任何图层即可显示新添加的图形。

IGraphicsContainer con = _mapControl.Map as IGraphicsContainer;
if (con != null)
{
  IFillShapeElement fillShapeElement = new PolygonElementClass();
  fillShapeElement.Symbol = fillSymbol;
  IElement element = (IElement)fillShapeElement;
  element.Geometry = feature.Shape;
  con.DeleteAllElements();
  con.AddElement(element, 0);
  _mapControl.ActiveView.ScreenDisplay.Invalidate(feature.Extent, true, _mapControl.ActiveView.get_ScreenCacheID(esriViewDrawPhase.esriViewGraphics, null));
}

1
[我认为ESRI文档不是描述性的。] [1] [1]:gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
由于您是直接绘制到显示屏(esriScreenCache.esriNoScreenCache),因此根本不需要刷新。实际上,刷新会导致图形消失。你试过了PartialRefresh吗?
blah238 2012年

尝试使用esriViewDrawPhase.esriViewGeography而不是esriViewAll
patrick

@ blah238没有(部分)刷新就不会显示。
gumo 2012年

@iterationx我测试了所有值,但仅对esriViewAll我有用。
gumo 2012年

Answers:



1

您需要检查以下阶段:我认为esriViewDrawPhase .esriViewGraphics将为您解决问题。但是,您也可以将相位与按位“或”组合。

http://help.arcgis.com/zh-CN/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/


1
另外,可以使用该envelope参数进一步限制应刷新的区域。
Petr Krebs 2012年

杰伊,esriViewGraphics也是我的第一个念头,但这没用。因此,我尝试了所有其他DrapPhase,并且仅esriViewAll显示了Polygon,还重新加载了所有图层。
gumo 2012年

感谢Petr,我想您的意思是feature.Extent用作第二个参数。我尝试过但没有成功。我认为这是关于正确的DrawPhase的问题,或者也许是我不知道的完全不同的方法。
gumo 2012年

@gumo:刚注意到arcengine标签。我不熟悉ArcEngine或其屏幕行为(也许有所不同)。如果/当出现ArcEngine特定的答案时,我将删除此问题。
杰伊·康明斯

1
您是否有StartDrawing和FinishDrawing调用?
杰·康明斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.