Quelle est la meilleure façon d'actualiser la vue après avoir dessiné des graphiques?

9

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 PartialRefreshavec d'autres, esriViewDrawPhasemais 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.AfterDrawpour 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));
}
gumo
la source
1
[Je pense que la documentation ESRI est un souhait non descriptif.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Étant donné que vous dessinez directement sur l'affichage ( esriScreenCache.esriNoScreenCache), vous ne devriez pas avoir à actualiser du tout. En fait, l'actualisation entraînerait la disparition du graphique. Avez-vous essayé sans la PartialRefreshligne?
blah238
Essayez esriViewDrawPhase.esriViewGeography au lieu de esriViewAll
patrick
@ blah238 Il n'apparaît pas sans un rafraîchissement (partiel).
gumo
@iterationx J'ai testé toutes les valeurs, mais cela n'a esriViewAllfonctionné que pour moi.
gumo

Réponses:

5

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.

Kirk Kuykendall
la source
1
Merci, ça marche. Je ne savais pas que je pouvais utiliser Invalidate()avec des couches non hachées. Voir ma mise à jour pour les détails d'implémentation.
gumo
1

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/

Jay Cummins
la source
1
De plus, on peut utiliser l' envelopeargument pour restreindre davantage la région à rafraîchir.
Petr Krebs
Jay, esriViewGraphicsma première pensée aussi, mais ça ne marche pas. J'ai donc essayé toutes les autres DrapPhases et n'affiche que esriViewAllle polygone mais recharge également toutes les couches.
gumo
Merci Petr, je suppose que vous entendez utiliser feature.Extentcomme 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.
gumo
@gumo: vient de remarquer la balise arcengine. Je ne connais pas ArcEngine ni le comportement de l'écran (peut-être que c'est différent). Je supprimerai cette question si / quand des réponses spécifiques à ArcEngine apparaissent.
Jay Cummins
1
Avez-vous les appels StartDrawing et FinishDrawing?
Jay Cummins