ฉันวาดรูปหลายเหลี่ยมบนปุ่มเพื่อไฮไลต์สถานที่ จากนั้นฉันต้องรีเฟรช ActiveView เพื่อแสดงรูปหลายเหลี่ยมใหม่ บรรทัดนี้ใช้งานได้:
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);
แต่มันจะโหลดซ้ำทุกชั้น ฉันพยายามโทรหาPartialRefresh
คนอื่นเกือบทุกวิธีesriViewDrawPhase
แต่ไม่มีรูปหลายเหลี่ยมแสดงรูปใหม่
มีวิธีแก้ปัญหาที่ดีกว่าการวาดใหม่esriViewDrawPhase.esriViewAll
หรือไม่?
ปรับปรุง
ฉันใช้ILayerExtensionDraw.AfterDraw
เพื่อทดสอบเฟสการวาดและ AfterDraw จะถูกโจมตีPartialRefresh()
ด้วยesriViewAll
เท่านั้น ส่วนขยายถูกเพิ่มในเลเยอร์ทั้งหมดใน MapControl.Layers ฉันคาดว่าจะได้รับผลกระทบทุกครั้งหรือไม่ เลเยอร์ใดที่mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
วาดเพื่อไม่ให้ AfterDraw ยกขึ้น?
ตอบ
ขอขอบคุณ Kirk ที่นี่เป็นวิธีแก้ปัญหาซึ่งแสดงกราฟิคที่เพิ่มใหม่โดยไม่ต้องโหลดซ้ำเลเยอร์ใด ๆ
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
) คุณไม่จำเป็นต้องรีเฟรชเลย ในความเป็นจริงการรีเฟรชจะทำให้กราฟิกหายไป คุณเคยลองโดยไม่มีPartialRefresh
บรรทัด?
esriViewAll
สำหรับฉันเท่านั้น