Saya menggambar poligon pada klik tombol untuk menyorot fitur. Maka saya perlu me-refresh ActiveView untuk menunjukkan poligon baru. Baris ini berfungsi:
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);
Tetapi selalu memuat ulang setiap lapisan. Saya mencoba hampir semua cara menelepon PartialRefresh
dengan yang lain esriViewDrawPhase
tetapi tidak satupun dari mereka yang menunjukkan poligon baru.
Apakah ada solusi yang lebih baik daripada menggambar ulang esriViewDrawPhase.esriViewAll
?
Memperbarui
Saya menggunakan ILayerExtensionDraw.AfterDraw
untuk menguji fase imbang dan AfterDraw hanya mendapat hit untuk PartialRefresh()
dengan esriViewAll
. Ekstensi ditambahkan ke semua lapisan di MapControl.Layers. Saya berharap bahwa itu akan kena setiap kali? Di lapisan mana mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
gambar tidak ditarik sehingga AfterDraw tidak terangkat?
Menjawab
Berkat Kirk, inilah solusinya, yang menunjukkan grafik baru yang ditambahkan tanpa memuat ulang lapisan apa pun.
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));
}
sumber
esriScreenCache.esriNoScreenCache
), Anda tidak perlu menyegarkan sama sekali. Bahkan menyegarkan akan menyebabkan grafik menghilang. Sudahkah Anda mencoba tanpaPartialRefresh
garis?esriViewAll
bekerja untuk saya.Jawaban:
Saya akan mencoba memanggil IScreenDisplay.InValidate , dan meneruskan cacheID untuk esriViewGraphics menggunakan IActiveView.ScreenCacheID . Lakukan ini setelah menambahkan grafik ke peta dengan melemparkan peta ke IGraphicsContainer, dan menambahkan melalui AddElement.
sumber
Invalidate()
dengan lapisan yang tidak tertutup. Lihat pembaruan saya untuk detail implementasi.Anda perlu memeriksa fase: Saya pikir esriViewDrawPhase .esriViewGraphics akan melakukan trik untuk Anda. Tetapi Anda juga dapat menggabungkan fase dengan bitwise OR.
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/
sumber
envelope
argumen untuk lebih membatasi wilayah yang harus disegarkan.esriViewGraphics
pikiran pertama saya juga, tapi tidak bekerja. Jadi saya mencoba semua DrapPhases lainnya dan hanyaesriViewAll
menunjukkan Polygon tetapi juga memuat semua lapisan.feature.Extent
argumen kedua. Saya mencobanya tanpa hasil. Saya pikir ini adalah pertanyaan tentang DrawPhase yang tepat atau mungkin ada pendekatan yang sama sekali berbeda yang tidak saya ketahui.