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 PartialRefresh
z innymi, esriViewDrawPhase
ale żaden z nich nie pokazał nowego wielokąta.
Czy istnieje lepsze rozwiązanie niż przerysowanie esriViewDrawPhase.esriViewAll
?
Aktualizacja
I stosuje się ILayerExtensionDraw.AfterDraw
do 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));
}
źródło
esriScreenCache.esriNoScreenCache
), nie musisz wcale odświeżać. W rzeczywistości odświeżenie spowodowałoby zniknięcie grafiki. Próbowałeś bezPartialRefresh
linii?esriViewAll
działało tylko dla mnie.Odpowiedzi:
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.
źródło
Invalidate()
z niezbielonymi warstwami. Zobacz moją aktualizację, aby uzyskać szczegóły dotyczące implementacji.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/
źródło
envelope
argumentu, aby dodatkowo ograniczyć region, który należy odświeżyć.esriViewGraphics
była moja pierwsza myśl, ale to nie działa. Więc wypróbowałem wszystkie inne DrapPhases iesriViewAll
pokazuje tylko Wielokąt, ale także ładuje wszystkie warstwy.feature.Extent
drugiego 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.