Який найкращий спосіб оновити вигляд після малювання графіки?


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

Спробуйте esriViewDrawPhase.esriViewGeography замість esriViewAll
Patrick

@ blah238 Не відображається без (часткового) оновлення.
gumo

@iterationx Я перевірив усі значення, але esriViewAllпрацював лише на мене.
гумо

Відповіді:


5

Я б спробував викликати IScreenDisplay.InValidate і передати в кеш-пам'ять для 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показує Полігон, але також перезавантажує всі шари.
гумо

Спасибі Петре, я думаю, ти маєш на увазі використання feature.Extentяк другий аргумент. Я намагався це не мати успіху. Я думаю, що це питання правильного DrawPhase або, можливо, існує зовсім інший підхід, про який я не знаю.
gumo

@gumo: щойно помітив тег арсенгіну. Я не знайомий з ArcEngine або його поведінкою на екрані (можливо, це інакше). Це питання я видалю, якщо / коли з’являться відповіді, специфічні для ArcEngine.
Jay Cummins

1
У вас є дзвінки StartDrawing та FinishDrawing?
Jay Cummins
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.