Каков наилучший способ обновления вида после рисования графики?

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 даже не поднимался?

Ответ

Благодаря Кирку, вот решение, которое показывает новую добавленную графику без перезагрузки какого-либо слоя.

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));
}
Gumo
источник
1
[Я думаю, что документация ESRI является желательной, а не описательной.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Поскольку вы рисуете прямо на дисплей ( esriScreenCache.esriNoScreenCache), вам не нужно обновлять вообще. На самом деле обновление приведет к исчезновению графики. Вы пробовали без PartialRefreshлинии?
blah238
Попробуйте esriViewDrawPhase.esriViewGeography вместо esriViewAll
Патрик
@ blah238 Он не появляется без (Частичного) обновления.
Gumo
@iterationx Я проверил все значения, но esriViewAllработал только для меня.
Gumo

Ответы:

5

Я попытался бы вызвать IScreenDisplay.InValidate и передать cacheID для esriViewGraphics, используя IActiveView.ScreenCacheID . Сделайте это после добавления графики на карту, приведя карту к IGraphicsContainer и добавив через AddElement.

Кирк Куйкендалл
источник
1
Спасибо, это работает. Я не знал, что смогу использовать Invalidate()с незакрашенными слоями. Смотрите мое обновление для деталей реализации.
Gumo
1

Вы должны проверить фазы: я думаю, что esriViewDrawPhase .esriViewGraphics поможет вам. Но вы также можете комбинировать фазы с побитовым ИЛИ.

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

Джей Камминс
источник
1
Кроме того, можно использовать envelopeаргумент для дальнейшего ограничения области, которая должна быть обновлена.
Петр Кребс
Джей, esriViewGraphicsтоже была моей первой мыслью, но она не работает. Поэтому я попробовал все остальные DrapPhases и esriViewAllпоказывает только полигон, но также перезагружает все слои.
gumo
Спасибо, Петр, я думаю, ты имеешь ввиду использование в feature.Extentкачестве второго аргумента. Я попробовал это безуспешно. Я думаю, что это вопрос правильного DrawPhase или, может быть, есть совершенно другой подход, о котором я не знаю.
gumo
@gumo: только что заметил тег arcengine. Я не знаком с ArcEngine или его поведением на экране (возможно, оно другое). Я удалю этот вопрос, если / когда появятся ответы, специфичные для ArcEngine.
Джей Камминс
1
Есть ли у вас вызовы StartDrawing и FinishDrawing?
Джей Камминс