Jaki jest najlepszy sposób odświeżenia widoku po narysowaniu grafiki?

9

Rysuję wielokąt po kliknięciu przycisku, aby podświetlić funkcję. Następnie muszę odświeżyć ActiveView, aby pokazać nowy wielokąt. Te linie działają:

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

Ale zawsze przeładowuje każdą warstwę. Próbowałem prawie wszystkich sposobów dzwonienia PartialRefreshz innymi, esriViewDrawPhaseale żaden z nich nie pokazał nowego wielokąta.

Czy istnieje lepsze rozwiązanie niż przerysowanie esriViewDrawPhase.esriViewAll?

Aktualizacja

I stosuje się ILayerExtensionDraw.AfterDrawdo testowania fazy remis i AfterDraw dostaje tylko trafienie do PartialRefresh()z esriViewAll. Rozszerzenie jest dodawane do wszystkich warstw w MapControl.Layers. Spodziewałem się, że trafi za każdym razem? Na której warstwie mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);rysuje się, aby AfterDraw nawet nie został podniesiony?

Odpowiedź

Dzięki Kirk jest tutaj rozwiązanie, które pokazuje nową dodaną grafikę bez ponownego ładowania żadnej warstwy.

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
źródło
1
[Myślę, że dokumentacja ESRI nie ma charakteru opisowego.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Ponieważ rysujesz bezpośrednio na display ( esriScreenCache.esriNoScreenCache), nie musisz wcale odświeżać. W rzeczywistości odświeżenie spowodowałoby zniknięcie grafiki. Próbowałeś bez PartialRefreshlinii?
blah238,
Spróbuj esriViewDrawPhase.esriViewGeography zamiast esriViewAll
patrick
@ blah238 Nie pokazuje się bez (częściowego) odświeżenia.
gumo
@iterationx Przetestowałem wszystkie wartości, ale esriViewAlldziałało tylko dla mnie.
gumo

Odpowiedzi:

5

Spróbowałbym wywołać IScreenDisplay.InValidate i przekazać identyfikator cacheID dla esriViewGraphics przy użyciu IActiveView.ScreenCacheID . Zrób to po dodaniu grafiki do mapy poprzez rzutowanie mapy na IGraphicsContainer i dodanie za pomocą AddElement.

Kirk Kuykendall
źródło
1
Dzięki, działa. Nie wiedziałem, że mogę używać Invalidate()z niezbielonymi warstwami. Zobacz moją aktualizację, aby uzyskać szczegóły dotyczące implementacji.
gumo
1

Musisz sprawdzić fazy: Myślę, że esriViewDrawPhase .esriViewGraphics zrobiłby dla ciebie lewę. Ale możesz także łączyć fazy z bitowym OR.

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

Jay Cummins
źródło
1
Ponadto można użyć tego envelopeargumentu, aby dodatkowo ograniczyć region, który należy odświeżyć.
Petr Krebs
Jay, to esriViewGraphicsbyła moja pierwsza myśl, ale to nie działa. Więc wypróbowałem wszystkie inne DrapPhases i esriViewAllpokazuje tylko Wielokąt, ale także ładuje wszystkie warstwy.
gumo
Dzięki Petr, chyba masz na myśli użycie feature.Extentdrugiego argumentu. Próbowałem tego bezskutecznie. Myślę, że jest to kwestia właściwego DrawPhase, a może istnieje zupełnie inne podejście, o którym nie wiem.
gumo
@ gumo: właśnie zauważyłem tag arcengine. Nie znam ArcEngine ani jego zachowania na ekranie (być może jest inaczej). Usunę to pytanie, jeśli / kiedy pojawią się odpowiedzi specyficzne dla ArcEngine.
Jay Cummins,
1
Czy masz wywołania StartDrawing i FinishDrawing?
Jay Cummins,