Qual è il modo migliore per aggiornare la vista dopo aver disegnato la grafica?


9

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

1
[Penso che la documentazione ESRI sia desiderosa e non descrittiva.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
Dato che stai disegnando direttamente sul display ( esriScreenCache.esriNoScreenCache), non dovresti aver bisogno di aggiornare affatto. In effetti un aggiornamento farebbe scomparire l'immagine. Hai provato senza la PartialRefreshlinea?
blah238,

Prova esriViewDrawPhase.esriViewGeography invece di esriViewAll
patrick,

@ blah238 Non viene visualizzato senza un aggiornamento (parziale).
gumo,

@iterationx Ho testato tutti i valori, ma ha esriViewAllfunzionato solo per me.
gumo,

Risposte:


5

Vorrei provare a chiamare IScreenDisplay.InValidate e passare un ID cache per esriViewGraphics utilizzando IActiveView.ScreenCacheID . Fallo dopo aver aggiunto la grafica alla mappa trasmettendo la mappa su IGraphicsContainer e aggiungendola tramite AddElement.


1
Grazie, funziona Non sapevo che avrei potuto usare Invalidate()con i livelli unchached. Vedi il mio aggiornamento per i dettagli di implementazione.
gumo,

1

Devi controllare le fasi: penso che esriViewDrawPhase .esriViewGraphics farebbe il trucco per te. Ma puoi anche combinare le fasi con un OR bit per bit.

http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/


1
Inoltre, si può usare l' envelopeargomento per limitare ulteriormente la regione che dovrebbe essere aggiornata.
Petr Krebs,

Jay, è esriViewGraphicsstato anche il mio primo pensiero, ma non funziona. Quindi ho provato tutti gli altri DrapPhases e esriViewAllmostra solo il poligono, ma ricarica anche tutti i livelli.
gumo,

Grazie Petr, immagino che intendi usare feature.Extentcome secondo argomento. Ci ho provato senza successo. Penso che sia una questione del giusto DrawPhase o forse c'è un approccio totalmente diverso che non conosco.
gumo,

@gumo: ho appena notato il tag arcengine. Non ho familiarità con ArcEngine o con il suo comportamento sullo schermo (forse è diverso). Eliminerò questa domanda se / quando vengono visualizzate le risposte specifiche di ArcEngine.
Jay Cummins,

1
Hai le chiamate StartDrawing e FinishDrawing?
Jay Cummins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.