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));
}
esriScreenCache.esriNoScreenCache
), nie musisz wcale odświeżać. W rzeczywistości odświeżenie spowodowałoby zniknięcie grafiki. Próbowałeś bez PartialRefresh
linii?
esriViewAll
działało tylko dla mnie.