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


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));
}

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?
Джей Камминс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.