Eu desenho um polígono no clique do botão para destacar um recurso. Preciso atualizar o ActiveView para mostrar o novo polígono. Estas linhas funcionam:
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);
Mas sempre recarrega todas as camadas. Tentei quase todas as maneiras de ligar PartialRefresh
com outras, esriViewDrawPhase
mas nenhuma delas mostrou o novo polígono.
Existe uma solução melhor do que redesenhar esriViewDrawPhase.esriViewAll
?
Atualizar
Eu usei um ILayerExtensionDraw.AfterDraw
para testar as fases do empate e o AfterDraw só é atingido PartialRefresh()
com esriViewAll
. A extensão é adicionada a todas as camadas no MapControl.Layers. Eu esperava que fosse atingido toda vez? Em qual camada mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);
desenha para que o AfterDraw nem seja elevado?
Responda
Graças a Kirk, aqui está a solução, que mostra o novo gráfico adicionado sem recarregar nenhuma camada.
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));
}
fonte
esriScreenCache.esriNoScreenCache
), não precisa atualizar. De fato, a atualização faria o gráfico desaparecer. Você já tentou sem aPartialRefresh
linha?esriViewAll
funcionou para mim.Respostas:
Eu tentaria chamar IScreenDisplay.InValidate e passaria um cacheID para esriViewGraphics usando IActiveView.ScreenCacheID . Faça isso depois de adicionar os gráficos ao mapa, lançando o mapa para IGraphicsContainer e adicionando via AddElement.
fonte
Invalidate()
com camadas não capturadas. Veja minha atualização para detalhes de implementação.Você precisa verificar as fases: Acho que esriViewDrawPhase .esriViewGraphics faria o truque para você. Mas você também pode combinar fases com um OR bit a bit.
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/index.html#/PartialRefresh_Method/0012000001nm000000/
fonte
envelope
argumento para restringir ainda mais a região que deve ser atualizada.esriViewGraphics
foi meu primeiro pensamento, mas não funciona. Então tentei todas as outras DrapPhases e sóesriViewAll
mostra o polígono, mas também recarrego todas as camadas.feature.Extent
como segundo argumento. Eu tentei isso sem sucesso. Eu acho que é uma questão da DrawPhase correta ou talvez haja uma abordagem totalmente diferente que eu não conheça.