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 PartialRefreshcon altri, esriViewDrawPhasema nessuno di loro ha mostrato il nuovo poligono.
C'è una soluzione migliore che ridisegnare esriViewDrawPhase.esriViewAll?
Aggiornare
Ho usato un ILayerExtensionDraw.AfterDrawper 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 PartialRefreshlinea?
esriViewAllfunzionato solo per me.