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

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.


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/


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.