Я малюю багатокутник на натисканні кнопки, щоб виділити особливість. Потім мені потрібно оновити 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));
}
esriScreenCache.esriNoScreenCache
), вам не потрібно буде оновлюватись зовсім. Насправді оновлення призведе до зникнення графіки. Ви пробували без PartialRefresh
лінії?
esriViewAll
працював лише на мене.