วิธีที่ดีที่สุดในการรีเฟรชมุมมองหลังจากวาดกราฟิกคืออะไร


9

ฉันวาดรูปหลายเหลี่ยมบนปุ่มเพื่อไฮไลต์สถานที่ จากนั้นฉันต้องรีเฟรช 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));
}

1
[ผมคิดว่าเอกสาร ESRI คือนึกไม่พรรณนา.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
เนื่องจากคุณวาดโดยตรงไปยังจอแสดงผล ( esriScreenCache.esriNoScreenCache) คุณไม่จำเป็นต้องรีเฟรชเลย ในความเป็นจริงการรีเฟรชจะทำให้กราฟิกหายไป คุณเคยลองโดยไม่มีPartialRefreshบรรทัด?
blah238

ลองใช้ esriViewDrawPhase.esriViewGeography แทน esriViewAll
patrick

@ blah238 ไม่แสดงขึ้นหากไม่มีการรีเฟรช (บางส่วน)
gumo

@iterationx ฉันทดสอบค่าทั้งหมด แต่ใช้ได้esriViewAllสำหรับฉันเท่านั้น
gumo

คำตอบ:


5

ฉันจะลองโทรIScreenDisplay.InValidateและผ่านใน cacheID สำหรับ esriViewGraphics ใช้IActiveView.ScreenCacheID ทำสิ่งนี้หลังจากเพิ่มกราฟิกลงในแผนที่โดยการหล่อแผนที่ไปที่ IGraphicsContainer และเพิ่มผ่าน AddElement


1
ขอบคุณมันใช้งานได้ ฉันไม่รู้ว่าฉันสามารถใช้Invalidate()กับเลเยอร์ที่ไม่ได้ใช้งานได้ ดูการปรับปรุงของฉันสำหรับรายละเอียดการใช้งาน
Gumo

1

คุณต้องตรวจสอบขั้นตอน: ฉันคิดว่าesriViewDrawPhase. esriViewGraphics จะทำเคล็ดลับสำหรับคุณ แต่คุณสามารถรวมเฟสด้วยค่าบิตหรือ

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


1
นอกจากนี้หนึ่งสามารถใช้envelopeอาร์กิวเมนต์เพื่อ จำกัด ภูมิภาคซึ่งควรจะรีเฟรช
Petr Krebs

เจย์esriViewGraphicsเป็นความคิดแรกของฉันเหมือนกัน แต่มันไม่ได้ผล ดังนั้นฉันจึงลอง DrapPhases อื่น ๆ ทั้งหมดและesriViewAllแสดงเฉพาะรูปหลายเหลี่ยม แต่ยังโหลดเลเยอร์ทั้งหมดอีกครั้ง
gumo

ขอบคุณ Petr ฉันคิดว่าคุณหมายถึงการใช้feature.Extentเป็นอาร์กิวเมนต์ที่สอง ฉันลองที่ไม่ประสบความสำเร็จ ฉันคิดว่ามันเป็นคำถามของ DrawPhase ที่ถูกต้องหรืออาจจะมีวิธีการที่แตกต่างกันโดยสิ้นเชิงที่ฉันไม่รู้
gumo

@gumo: เพิ่งสังเกตเห็นแท็ก arcengine ฉันไม่คุ้นเคยกับ ArcEngine หรือพฤติกรรมหน้าจอ (อาจแตกต่างกัน) ฉันจะลบคำถามนี้ถ้า / เมื่อ ArcEngine คำตอบเฉพาะปรากฏขึ้น
Jay Cummins

1
คุณมีการโทร StartDrawing และ FinishDrawing หรือไม่
Jay Cummins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.