2012-04-28 38 views
6

Hiện tại tôi có một hình ảnh trên canvas mà tôi có thể tự do di chuyển trong ứng dụng của mình mà trên đó tôi có 6 lớp DrawingVisual được hiển thị nhưng có vẻ khá chậm. Tôi đang sử dụng RenderTargetBitmap để hiển thị hình ảnh. Có cách nào nhanh hơn để hiển thị hình ảnh trên hình ảnh hoặc trên bất kỳ phần tử khung nào khác mà tôi có thể tự do di chuyển trên canvas không?Hiển thị bản vẽ nhanh trong WPF

XAML:

<Canvas> 
    <Image Height="505" HorizontalAlignment="Left" Margin="0,0,0,0" Name="_MapImage" Stretch="Fill" VerticalAlignment="Top" Width="700" MouseLeftButtonDown="_MapImage_MouseDown" MouseWheel="_MapImage_MouseWheel" MouseLeftButtonUp="_MapImage_MouseUp" MouseMove="_MapImage_MouseMove" /> 
</Canvas> 

mã:

_renderRoutesBitmap = new RenderTargetBitmap((int)(_MapImage.Width), (int)(_MapImage.Height), 96, 96, PixelFormats.Default); 

for (int i = 6; i < 8; ++i) 
{ 
    if((layerCode/(int)Math.Pow(10,i) % 2) == 1) 
    _renderRoutesBitmap.Render(_layers[i]); //takes too much time 
} 
_RouteImage.Source = _renderRoutesBitmap; 
+0

bạn có thể mô tả chi tiết những gì bạn có trong _layers không? –

+0

mảng _layers chứa các bản vẽ, đó thực sự là các loại đường khác nhau của bản đồ tôi đang vẽ, được hiển thị trên một hình ảnh. –

Trả lời

2

tôi phải làm một điều tương tự như một số thời gian trước đây, nơi tôi đã phải viết ứng dụng GIS của riêng tôi. Tôi đã phải vẽ hàng ngàn và hàng ngàn bản vẽ hình ảnh, phát hiện của tôi là RenderTargetBitmap không phải là một lựa chọn tốt cho các hoạt động bitmap vì nó bị không sử dụng tăng tốc phần cứng đồ họa. Silverlight có lớp phù hợp hơn; WriteableBitmap cho phép ứng dụng của bạn trực tiếp ghi vào bộ đệm GPU. Vấn đề duy nhất với điều này là nó chỉ có sẵn cho Silverlight. Nếu bạn muốn sử dụng bitmap cho các hoạt động của mình thì bạn có thể sử dụng tương đương WriteableBitmap cho WPF là WriteableBitmapEx có sẵn here.

Vì bạn chỉ có tổng số 6 bản vẽ, tôi khuyên bạn nên chuyển sang sử dụng phần tử giao diện người dùng cấp cao hơn như Hình dạng và hình dạng như vậy.

+1

Tôi không thể sử dụng WriteableBitmapEx như DrawingBrush mà tôi không thể vẽ một điều khiển. – lindexi

2

Hiển thị đối tượng Hình ảnh bằng cách sử dụng Render không phải là giải pháp tốt. Nếu bạn có Canvas và bạn muốn hiển thị hình ảnh của mình, bạn không cần chuyển đổi hình ảnh thành bitmap, nếu bạn thực hiện chuyển đổi, hình ảnh của bạn không thể thu nhỏ theo bất kỳ số lượng nào mà không làm giảm chất lượng (tính năng của đồ họa vectơ) . Có một khả năng khác: tạo Canvas của riêng bạn. Tôi hiện đang sử dụng phương pháp này và không có vấn đề gì khi vẽ hàng nghìn hình dạng. Đây là một ví dụ rất đơn giản:

public class DrawingCanvas : Panel 
{ 


public List<Visual> visuals = new List<Visual>(); 


public void AddVisual(Visual visual) 
{ 
    if (visual == null) 
     return; 
    this.visuals.Add(visual); 

    base.AddVisualChild(visual); 
    base.AddLogicalChild(visual); 
} 



public void RemoveVisual(Visual visual) 
{ 
    if (visual == null) 
     return; 
    this.visuals.Remove(visual); 

    base.RemoveVisualChild(visual); 
    base.RemoveLogicalChild(visual); 
} 

} 

Sử dụng DrawingCanvas thay vì Canvas lớp.

Các vấn đề liên quan