Je dessine un polygone en cliquant sur le bouton pour mettre en surbrillance une entité. Ensuite, je dois actualiser ActiveView pour afficher le nouveau polygone. Ces lignes fonctionnent:
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);
Mais il recharge toujours chaque couche. J'ai essayé presque toutes les façons d'appeler PartialRefresh
avec d'autres, esriViewDrawPhase
mais aucune d'entre elles n'a montré le nouveau polygone.
Y a-t-il une meilleure solution que de redessiner avec esriViewDrawPhase.esriViewAll
?
Mise à jour
J'ai utilisé un ILayerExtensionDraw.AfterDraw
pour tester les phases de dessin et l'AfterDraw n'est touché que PartialRefresh()
par esriViewAll
. L'extension est ajoutée à toutes les couches dans MapControl.Layers. Je m'attendais à ce qu'il soit touché à chaque fois? Sur quel calque mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
dessine-t-on pour que l'AfterDraw ne soit même pas soulevé?
Réponse
Merci à Kirk, voici la solution, qui montre le nouveau graphique ajouté sans recharger aucun calque.
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
), vous ne devriez pas avoir à actualiser du tout. En fait, l'actualisation entraînerait la disparition du graphique. Avez-vous essayé sans laPartialRefresh
ligne?esriViewAll
fonctionné que pour moi.Réponses:
J'essayerais d'appeler IScreenDisplay.InValidate et de passer un cacheID pour esriViewGraphics à l'aide de IActiveView.ScreenCacheID . Pour ce faire, après avoir ajouté les graphiques à la carte en convertissant la carte en IGraphicsContainer et en l'ajoutant via AddElement.
la source
Invalidate()
avec des couches non hachées. Voir ma mise à jour pour les détails d'implémentation.Vous devez vérifier les phases: je pense que esriViewDrawPhase .esriViewGraphics ferait l'affaire pour vous. Mais vous pouvez également combiner des phases avec un OU au niveau du bit.
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/
la source
envelope
argument pour restreindre davantage la région à rafraîchir.esriViewGraphics
ma première pensée aussi, mais ça ne marche pas. J'ai donc essayé toutes les autres DrapPhases et n'affiche queesriViewAll
le polygone mais recharge également toutes les couches.feature.Extent
comme deuxième argument. J'ai essayé ça sans succès. Je pense que c'est une question de la bonne DrawPhase ou peut-être qu'il y a une approche totalement différente que je ne connais pas.