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

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.


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/


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.