Cách tốt nhất để làm mới khung nhìn sau khi vẽ đồ họa là gì?


9

Tôi vẽ một đa giác trên nút bấm để làm nổi bật một tính năng. Sau đó, tôi cần làm mới ActiveView để hiển thị đa giác mới. Dòng này làm việc:

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

Nhưng nó luôn tải lại mọi lớp. Tôi đã thử gần như tất cả các cách gọi PartialRefreshvới người khác esriViewDrawPhasenhưng không ai trong số họ thực hiện đa giác mới.

Có một giải pháp tốt hơn là vẽ lại với esriViewDrawPhase.esriViewAll?

Cập nhật

Tôi đã sử dụng một ILayerExtensionDraw.AfterDrawđể kiểm tra các giai đoạn bốc thăm và AfterDraw chỉ được hit cho PartialRefresh()với esriViewAll. Phần mở rộng được thêm vào tất cả các lớp trong MapControl.Layers. Tôi dự kiến ​​rằng nó sẽ được nhấn mọi lúc? Lớp nào mapControl.ActiveView.ScreenDisplay.DrawPolygon(feature.Shape);vẽ để AfterDraw thậm chí không được nâng lên?

Câu trả lời

Nhờ Kirk đây là giải pháp, cho thấy đồ họa mới được thêm vào mà không cần tải lại bất kỳ lớp nào.

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
[Tôi nghĩ rằng tài liệu ESRI mong muốn không được mô tả.] [1] [1]: gis.stackexchange.com/questions/17422/remove-layer-labels
Chaz

1
Vì bạn đang vẽ trực tiếp lên màn hình ( esriScreenCache.esriNoScreenCache), bạn không cần phải làm mới chút nào. Trong thực tế làm mới sẽ làm cho đồ họa biến mất. Bạn đã thử mà không có PartialRefreshdòng?
blah238

Hãy thử esriViewDrawPhase.esriViewGeography thay vì esriView ALL
patrick

@ blah238 Nó không hiển thị mà không có Làm mới (Một phần).
kẹo cao su

@iterationx Tôi đã thử nghiệm tất cả các giá trị, nhưng chỉ esriViewAlllàm việc cho tôi.
kẹo cao su

Câu trả lời:


5

Tôi sẽ thử gọi IScreenDisplay.InValidate và chuyển vào cacheID cho esriViewGraphics bằng IActiveView.ScreenCacheID . Thực hiện việc này sau khi thêm đồ họa vào bản đồ bằng cách chuyển bản đồ sang IGraphicsContainer và thêm thông qua AddEuity.


1
Cảm ơn, nó hoạt động. Tôi không biết tôi có thể sử dụng Invalidate()với các lớp không bị che chắn. Xem cập nhật của tôi để biết chi tiết thực hiện.
kẹo cao su

1

Bạn cần kiểm tra các giai đoạn: Tôi nghĩ esriViewDrawPhase .esriViewGraphics sẽ thực hiện thủ thuật cho bạn. Nhưng bạn cũng có thể kết hợp các pha với bitwise OR.

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


1
Ngoài ra, người ta có thể sử dụng envelopeđối số để hạn chế hơn nữa khu vực cần được làm mới.
Petr Krebs

Jay, esriViewGraphicscũng là suy nghĩ đầu tiên của tôi, nhưng nó không hoạt động. Vì vậy, tôi đã thử tất cả các DrapPhase khác và chỉ esriViewAllhiển thị Đa giác nhưng cũng tải lại tất cả các lớp.
kẹo cao su

Cảm ơn Petr, tôi đoán bạn có nghĩa là sử dụng feature.Extentnhư là đối số thứ hai. Tôi đã thử điều đó mà không thành công. Tôi nghĩ đó là một câu hỏi về DrawPhase đúng hoặc có thể có một cách tiếp cận hoàn toàn khác mà tôi không biết.
kẹo cao su

@gumo: chỉ cần chú ý thẻ arcengine. Tôi không quen thuộc với ArcEngine hoặc nó hoạt động trên màn hình (có thể nó khác). Tôi sẽ xóa câu hỏi này nếu / khi câu trả lời dành riêng cho ArcEngine xuất hiện.
Jay Cummins

1
Bạn có các cuộc gọi StartDrawing và FinishDrawing không?
Jay Cummins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.