Я рисую многоугольник при нажатии кнопки, чтобы выделить элемент. Затем мне нужно обновить 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 даже не поднимался?
Ответ
Благодаря Кирку, вот решение, которое показывает новую добавленную графику без перезагрузки какого-либо слоя.
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));
}
esriScreenCache.esriNoScreenCache
), вам не нужно обновлять вообще. На самом деле обновление приведет к исчезновению графики. Вы пробовали безPartialRefresh
линии?esriViewAll
работал только для меня.Ответы:
Я попытался бы вызвать IScreenDisplay.InValidate и передать cacheID для esriViewGraphics, используя IActiveView.ScreenCacheID . Сделайте это после добавления графики на карту, приведя карту к IGraphicsContainer и добавив через AddElement.
источник
Invalidate()
с незакрашенными слоями. Смотрите мое обновление для деталей реализации.Вы должны проверить фазы: я думаю, что esriViewDrawPhase .esriViewGraphics поможет вам. Но вы также можете комбинировать фазы с побитовым ИЛИ.
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/
источник
envelope
аргумент для дальнейшего ограничения области, которая должна быть обновлена.esriViewGraphics
тоже была моей первой мыслью, но она не работает. Поэтому я попробовал все остальные DrapPhases иesriViewAll
показывает только полигон, но также перезагружает все слои.feature.Extent
качестве второго аргумента. Я попробовал это безуспешно. Я думаю, что это вопрос правильного DrawPhase или, может быть, есть совершенно другой подход, о котором я не знаю.