Apa cara terbaik untuk menyegarkan tampilan setelah menggambar grafik?

9

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 PartialRefreshdengan yang lain esriViewDrawPhasetetapi tidak satupun dari mereka yang menunjukkan poligon baru.

Apakah ada solusi yang lebih baik daripada menggambar ulang esriViewDrawPhase.esriViewAll?

Memperbarui

Saya menggunakan ILayerExtensionDraw.AfterDrawuntuk 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));
}
gumo
sumber
1
[Saya pikir dokumentasi ESRI angan-angan tidak deskriptif.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz
1
Karena Anda menggambar langsung ke tampilan ( esriScreenCache.esriNoScreenCache), Anda tidak perlu menyegarkan sama sekali. Bahkan menyegarkan akan menyebabkan grafik menghilang. Sudahkah Anda mencoba tanpa PartialRefreshgaris?
blah238
Coba esriViewDrawPhase.esriViewGeography alih-alih esriViewAll
patrick
@ blah238 Ini tidak muncul tanpa Refresh (Sebagian).
Gumo
@iterationx Saya menguji semua nilai, tetapi hanya esriViewAllbekerja untuk saya.
Gumo

Jawaban:

5

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.

Kirk Kuykendall
sumber
1
Terima kasih, ini berhasil. Saya tidak tahu saya bisa menggunakannya Invalidate()dengan lapisan yang tidak tertutup. Lihat pembaruan saya untuk detail implementasi.
Gumo
1

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/

Jay Cummins
sumber
1
Selain itu, seseorang dapat menggunakan envelopeargumen untuk lebih membatasi wilayah yang harus disegarkan.
Petr Krebs
Jay, esriViewGraphicspikiran pertama saya juga, tapi tidak bekerja. Jadi saya mencoba semua DrapPhases lainnya dan hanya esriViewAllmenunjukkan Polygon tetapi juga memuat semua lapisan.
Gumo
Terima kasih Petr, saya kira maksud Anda menggunakan feature.Extentargumen 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.
Gumo
@ gumo: baru saja perhatikan tag arcengine. Saya tidak terbiasa dengan ArcEngine atau perilaku layarnya (mungkin berbeda). Saya akan menghapus pertanyaan ini jika / ketika jawaban spesifik ArcEngine muncul.
Jay Cummins
1
Apakah Anda memiliki panggilan StartDrawing dan FinishDrawing?
Jay Cummins