Grafik çizdikten sonra görünümü yenilemenin en iyi yolu nedir?


9

Bir özelliği vurgulamak için butona çokgen çiziyorum. Sonra yeni çokgeni göstermek için ActiveView yenilemek gerekiyor. Bu çizgiler işe yarıyor:

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);

Ancak her katmanı her zaman yeniden yükler. PartialRefreshDiğerleriyle aramanın neredeyse tüm yollarını denedim esriViewDrawPhaseama hiçbiri yeni çokgeni göstermedi.

Yeniden çizmekten daha iyi bir çözüm var mı esriViewDrawPhase.esriViewAll?

Güncelleme

Bir kullanılan ILayerExtensionDraw.AfterDrawberaberlik aşamalarını test etmek ve AfterDraw yalnızca vuruş yapsın PartialRefresh()ile esriViewAll. Uzantı, MapControl.Layers içindeki tüm katmanlara eklenir. Her seferinde vurulmasını bekliyordum? mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);AfterDraw'ın yükseltilmemesi için hangi katmanda çizim yapar ?

Cevap

Kirk sayesinde, yeni eklenen grafiği herhangi bir katmanı yeniden yüklemeden gösteren çözüm burada.

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
[Bence ESRI belgeleri açıklayıcı değil.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
Doğrudan ekrana ( esriScreenCache.esriNoScreenCache) çizim yaptığınızdan, hiç yenilemenize gerek yoktur. Aslında yenileme, grafiğin kaybolmasına neden olur. PartialRefreshÇizgi olmadan denedin mi?
blah238

EsriViewAll yerine esriViewDrawPhase.esriViewGeography'yi deneyin
patrick

@ blah238 (Kısmi) Yenileme olmadan görünmüyor.
Gumo

@iterationx Tüm değerleri test ettim, ama sadece esriViewAllbenim için çalıştım.
Gumo

Yanıtlar:


5

IScreenDisplay.InValidate çağırma denemek ve IActiveView.ScreenCacheID kullanarak esriViewGraphics için bir önbellek geçmek . Haritayı IGraphicsContainer'a ekleyip AddElement ile ekleyerek grafikleri haritaya ekledikten sonra bunu yapın.


1
Teşekkürler, işe yarıyor. Invalidate()Bağlanmamış katmanlarla kullanabileceğimi bilmiyordum . Uygulama ayrıntıları için güncellememe bakın.
Ocak'ta Gumo

1

Aşamaları kontrol etmeniz gerekiyor: Sanırım esriViewDrawPhase .esriViewGraphics sizin için hile yapar. Ancak fazları bitsel VEYA ile de birleştirebilirsiniz.

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


1
Ek olarak, envelopeyenilenmesi gereken bölgeyi daha da kısıtlamak için argüman kullanılabilir .
Petr Krebs

Jay, esriViewGraphicsbenim de ilk düşüncemdi ama işe yaramıyor. Bu yüzden diğer tüm DrapPhases'leri denedim ve sadece Çokgeni esriViewAllgösterir, aynı zamanda tüm katmanları yeniden yükler.
Gumo

Teşekkürler Petr, sanırım feature.Extentikinci argüman olarak kullanmak istiyorsun . Başarısız denedim. Bence bu doğru DrawPhase ile ilgili bir soru veya belki de bilmediğim tamamen farklı bir yaklaşım var.
Gumo

@ gumo: arcengine etiketini fark ettim. ArcEngine veya ekran davranışına aşina değilim (belki de farklıdır). ArcEngine'a özel cevaplar görünürse / olduğunda bu soruyu silerim.
Jay Cummins

1
StartDrawing ve FinishDrawing çağrılarınız var mı?
Jay Cummins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.