¿Cuál es la mejor manera de actualizar la vista después de dibujar gráficos?

9

Dibujo un polígono al hacer clic en el botón para resaltar una característica. Luego necesito actualizar ActiveView para mostrar el nuevo polígono. Estas líneas funcionan:

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

Pero siempre recarga cada capa. Intenté casi todas las formas de llamar PartialRefreshcon otras, esriViewDrawPhasepero ninguna de ellas mostró el nuevo polígono.

¿Existe una solución mejor que volver a dibujar esriViewDrawPhase.esriViewAll?

Actualizar

Utilicé un ILayerExtensionDraw.AfterDrawpara probar las fases de sorteo y AfterDraw solo es golpeado PartialRefresh()con esriViewAll. La extensión se agrega a todas las capas en MapControl.Layers. ¿Esperaba que fuera golpeado cada vez? ¿En qué capa mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);dibuja para que el AfterDraw ni siquiera esté elevado?

Responder

Gracias a Kirk, aquí está la solución, que muestra el nuevo gráfico agregado sin recargar ninguna capa.

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
fuente
1
[Creo que la documentación de ESRI es ilusoria, no descriptiva.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Como está dibujando directamente en la pantalla ( esriScreenCache.esriNoScreenCache), no debería necesitar actualizar en absoluto. De hecho, la actualización hará que el gráfico desaparezca. ¿Has probado sin la PartialRefreshlínea?
blah238
Prueba esriViewDrawPhase.esriViewGeography en lugar de esriViewAll
patrick
@ blah238 No se muestra sin una actualización (parcial).
gumo
@iterationx Probé todos los valores, pero solo esriViewAllfuncionó para mí.
gumo

Respuestas:

5

Intentaría llamar a IScreenDisplay.InValidate y pasar un ID de caché para esriViewGraphics usando IActiveView.ScreenCacheID . Haga esto después de agregar los gráficos al mapa enviando el mapa a IGraphicsContainer y agregando a través de AddElement.

Kirk Kuykendall
fuente
1
Gracias funciona. No sabía que podía usar Invalidate()con capas sin guardar. Vea mi actualización para detalles de implementación.
gumo
1

Debe verificar las fases: creo que esriViewDrawPhase .esriViewGraphics haría el truco por usted. Pero también puede combinar fases con un OR bit a bit.

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

Jay Cummins
fuente
1
Además, se puede usar el envelopeargumento para restringir aún más la región que debe actualizarse.
Petr Krebs
Jay, también esriViewGraphicsfue mi primer pensamiento, pero no funciona. Así que probé todas las otras DrapPhases y solo esriViewAllmuestra el Polígono, pero también recarga todas las capas.
gumo
Gracias Petr, supongo que te refieres a usarlo feature.Extentcomo segundo argumento. Lo intenté sin éxito. Creo que es una cuestión del DrawPhase correcto o tal vez hay un enfoque totalmente diferente que no conozco.
gumo
@ gumo: acabo de notar la etiqueta arcengine. No estoy familiarizado con el ArcEngine o el comportamiento de la pantalla (tal vez es diferente). Eliminaré esta pregunta si / cuando aparezcan respuestas específicas de ArcEngine.
Jay Cummins
1
¿Tiene las llamadas StartDrawing y FinishDrawing?
Jay Cummins