グラフィックスを描画した後にビューを更新する最良の方法は何ですか?


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が発生しないように、どのレイヤーに描画しますか?

回答

カークのおかげで、ここに解決策があり、レイヤーを再ロードせずに、新しく追加されたグラフィックを表示します。

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 2012年

esriViewAllの代わりにesriViewDrawPhase.esriViewGeographyを試してください
patrick

@ blah238(Partial)Refreshがないと表示されません。
gumo

@iterationxすべての値をテストしましたが、esriViewAll機能するのは自分だけでした。
gumo 2012年

回答:


5

私は呼び出ししようとするだろうIScreenDisplay.InValidateを、そして使用esriViewGraphicsためcacheIDに渡しIActiveView.ScreenCacheIDを。これを行うには、マップをIGraphicsContainerにキャストし、AddElementを介して追加して、グラフィックをマップに追加します。


1
ありがとう、うまくいきました。Invalidate()チャッチされていないレイヤーで使用できることを知りませんでした。実装の詳細については、私の更新を参照してください。
gumo 2012年

1

フェーズを確認する必要があります。esriViewDrawPhase .esriViewGraphicsがうまくいくと思います。ただし、フェーズをビットごとのORで結合することもできます。

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


1
さらに、envelope引数を使用して、更新する領域をさらに制限できます。
Petr Krebs

ジェイesriViewGraphicsも私の最初の考えでしたが、うまくいきません。他のすべてのDrapPhasesを試してみたところesriViewAll、Polygon のみが表示され、すべてのレイヤーが再ロードされました。
gumo 2012年

Petrに感謝しfeature.Extentます。第2引数として使用することを意味しているようです。私はそれを試みたが成功しなかった。それは正しいDrawPhaseの問題だと思います。あるいは、私が知らないまったく異なるアプローチがあるかもしれません。
gumo

@gumo:arcengineタグに気づきました。私は、ArcEngineや画面の動作に精通していません(多分それは異なるでしょう)。ArcEngine固有の回答が表示された場合は、この質問を削除します。
Jay Cummins、2012年

1
StartDrawingとFinishDrawingの呼び出しはありますか?
Jay Cummins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.