Wie kann die Ansicht nach dem Zeichnen von Grafiken am besten aktualisiert werden?

9

Ich zeichne ein Polygon beim Klicken auf eine Schaltfläche, um ein Feature hervorzuheben. Dann muss ich die ActiveView aktualisieren, um das neue Polygon anzuzeigen. Diese Zeilen funktionieren:

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

Aber es lädt immer jede Ebene neu. Ich habe fast alle Möglichkeiten ausprobiert, PartialRefreshmit anderen zu esriViewDrawPhasetelefonieren, aber keine von ihnen zeigte das neue Polygon.

Gibt es eine bessere Lösung als neu zu zeichnen esriViewDrawPhase.esriViewAll?

Aktualisieren

Früher habe ich eine ILayerExtensionDraw.AfterDrawder Ziehphase zu testen und die AfterDraw bekommt nur Treffer für PartialRefresh()mit esriViewAll. Die Erweiterung wird allen Ebenen in MapControl.Layers hinzugefügt. Ich habe erwartet, dass es jedes Mal getroffen wird? Auf welcher Ebene wird mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);gezeichnet, damit AfterDraw nicht einmal angehoben wird?

Antworten

Dank Kirk ist hier die Lösung, die die neu hinzugefügte Grafik zeigt, ohne eine Ebene neu zu laden.

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));
}
Gumo
quelle
1
[Ich denke, die ESRI-Dokumentation ist wünschenswert, nicht beschreibend.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Da Sie direkt auf das Display ( esriScreenCache.esriNoScreenCache) zeichnen , sollten Sie überhaupt keine Aktualisierung benötigen. Tatsächlich würde eine Aktualisierung dazu führen, dass die Grafik verschwindet. Haben Sie es ohne die PartialRefreshLeitung versucht ?
blah238
Versuchen Sie esriViewDrawPhase.esriViewGeography statt esriViewAll
patrick
@ blah238 Es wird nicht ohne (teilweise) Aktualisierung angezeigt.
Gumo
@iterationx Ich habe alle Werte getestet, aber nur esriViewAllfür mich gearbeitet.
Gumo

Antworten:

5

Ich würde versuchen, IScreenDisplay.InValidate aufzurufen und eine CacheID für esriViewGraphics mit IActiveView.ScreenCacheID zu übergeben . Führen Sie dies aus, nachdem Sie die Grafiken zur Karte hinzugefügt haben, indem Sie die Karte in IGraphicsContainer umwandeln und über AddElement hinzufügen.

Kirk Kuykendall
quelle
1
Danke, es funktioniert. Ich wusste nicht, dass ich Invalidate()mit ungebundenen Schichten arbeiten kann. Einzelheiten zur Implementierung finden Sie in meinem Update.
Gumo
1

Sie müssen die Phasen überprüfen: Ich denke, esriViewDrawPhase .esriViewGraphics würde den Trick für Sie tun. Sie können Phasen aber auch mit einem bitweisen ODER kombinieren.

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

Jay Cummins
quelle
1
Zusätzlich kann man das envelopeArgument verwenden, um die Region, die aktualisiert werden soll, weiter einzuschränken.
Petr Krebs
Jay, esriViewGraphicswar auch mein erster Gedanke, aber es funktioniert nicht. Also habe ich alle anderen DrapPhases ausprobiert und nur esriViewAlldas Polygon angezeigt, aber auch alle Ebenen neu geladen .
Gumo
Danke Petr, ich denke du meinst feature.Extentals zweites Argument. Ich habe das ohne Erfolg versucht. Ich denke, es ist eine Frage der richtigen DrawPhase oder vielleicht gibt es einen völlig anderen Ansatz, den ich nicht kenne.
Gumo
@gumo: habe gerade das arcengine tag bemerkt. Ich bin nicht mit der ArcEngine oder dem Bildschirmverhalten vertraut (möglicherweise ist es anders). Ich werde diese Frage löschen, wenn ArcEngine-spezifische Antworten angezeigt werden.
Jay Cummins
1
Haben Sie die Aufrufe StartDrawing und FinishDrawing?
Jay Cummins