Qual é a melhor maneira de atualizar a vista após desenhar gráficos?


9

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 PartialRefreshcom outras, esriViewDrawPhasemas nenhuma delas mostrou o novo polígono.

Existe uma solução melhor do que redesenhar esriViewDrawPhase.esriViewAll?

Atualizar

Eu usei um ILayerExtensionDraw.AfterDrawpara 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));
}

11
[Eu acho que a documentação ESRI não é wishful descritivo.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

11
Como você está desenhando diretamente na tela ( esriScreenCache.esriNoScreenCache), não precisa atualizar. De fato, a atualização faria o gráfico desaparecer. Você já tentou sem a PartialRefreshlinha?
precisa saber é o seguinte

Tente esriViewDrawPhase.esriViewGeography vez de esriViewAll
patrick

@ blah238 Não está aparecendo sem uma atualização (parcial).
gumo

@iterationx Testei todos os valores, mas só esriViewAllfuncionou para mim.
gumo 31/01

Respostas:


5

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.


11
Obrigado, funciona. Eu não sabia que poderia usar Invalidate()com camadas não capturadas. Veja minha atualização para detalhes de implementação.
gumo 31/01

1

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/


11
Além disso, pode-se usar o envelopeargumento para restringir ainda mais a região que deve ser atualizada.
Petr Krebs

Jay, também esriViewGraphicsfoi meu primeiro pensamento, mas não funciona. Então tentei todas as outras DrapPhases e só esriViewAllmostra o polígono, mas também recarrego todas as camadas.
gumo

Obrigado Petr, acho que você quer dizer usar feature.Extentcomo 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.
gumo

@ gumo: apenas notei a tag arcengine. Não estou familiarizado com o ArcEngine ou o comportamento da tela (talvez seja diferente). Excluirei esta pergunta se / quando respostas específicas do ArcEngine aparecerem.
Jay Cummins

11
Você tem as chamadas StartDrawing e FinishDrawing?
Jay Cummins
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.