Traccio un poligono facendo clic sul pulsante per evidenziare una funzione. Quindi devo aggiornare ActiveView per mostrare il nuovo poligono. Queste linee funzionano:
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);
Ma ricarica sempre ogni livello. Ho provato quasi tutti i modi di chiamare PartialRefresh
con altri, esriViewDrawPhase
ma nessuno di loro ha mostrato il nuovo poligono.
C'è una soluzione migliore che ridisegnare esriViewDrawPhase.esriViewAll
?
Aggiornare
Ho usato un ILayerExtensionDraw.AfterDraw
per testare le fasi di tiraggio e l'AfterDraw ottiene solo colpo per PartialRefresh()
con esriViewAll
. L'estensione viene aggiunta a tutti i livelli in MapControl.Layers. Mi aspettavo che venisse colpito ogni volta? Su quale livello viene mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
disegnato in modo che AfterDraw non sia nemmeno sollevato?
Risposta
Grazie a Kirk ecco la soluzione, che mostra la nuova grafica aggiunta senza ricaricare alcun livello.
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
), non dovresti aver bisogno di aggiornare affatto. In effetti un aggiornamento farebbe scomparire l'immagine. Hai provato senza la PartialRefresh
linea?
esriViewAll
funzionato solo per me.