Tôi vẽ một đa giác trên nút bấm để làm nổi bật một tính năng. Sau đó, tôi cần làm mới ActiveView để hiển thị đa giác mới. Dòng này làm việc:
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);
Nhưng nó luôn tải lại mọi lớp. Tôi đã thử gần như tất cả các cách gọi PartialRefresh
với người khác esriViewDrawPhase
nhưng không ai trong số họ thực hiện đa giác mới.
Có một giải pháp tốt hơn là vẽ lại với esriViewDrawPhase.esriViewAll
?
Cập nhật
Tôi đã sử dụng một ILayerExtensionDraw.AfterDraw
để kiểm tra các giai đoạn bốc thăm và AfterDraw chỉ được hit cho PartialRefresh()
với esriViewAll
. Phần mở rộng được thêm vào tất cả các lớp trong MapControl.Layers. Tôi dự kiến rằng nó sẽ được nhấn mọi lúc? Lớp nào mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
vẽ để AfterDraw thậm chí không được nâng lên?
Câu trả lời
Nhờ Kirk đây là giải pháp, cho thấy đồ họa mới được thêm vào mà không cần tải lại bất kỳ lớp nào.
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
), bạn không cần phải làm mới chút nào. Trong thực tế làm mới sẽ làm cho đồ họa biến mất. Bạn đã thử mà không có PartialRefresh
dòng?
esriViewAll
làm việc cho tôi.