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, PartialRefresh
mit anderen zu esriViewDrawPhase
telefonieren, 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.AfterDraw
der 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));
}
quelle
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 diePartialRefresh
Leitung versucht ?esriViewAll
für mich gearbeitet.Antworten:
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.
quelle
Invalidate()
mit ungebundenen Schichten arbeiten kann. Einzelheiten zur Implementierung finden Sie in meinem Update.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/
quelle
envelope
Argument verwenden, um die Region, die aktualisiert werden soll, weiter einzuschränken.esriViewGraphics
war auch mein erster Gedanke, aber es funktioniert nicht. Also habe ich alle anderen DrapPhases ausprobiert und nuresriViewAll
das Polygon angezeigt, aber auch alle Ebenen neu geladen .feature.Extent
als 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.