2012-04-28 65 views
6

目前我在畫布上有一個圖像,可以在我的應用程序中隨意移動,其中繪製了6層DrawingVisuals,但它看起來很慢。我正在使用RenderTargetBitmap來渲染視覺效果。有沒有更快的方法來顯示圖像上的視覺效果或其他任何可以在畫布上自由移動的框架元素?在WPF中快速渲染drawingviews

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> 

代碼:

_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

你能詳細描述一下你在_layers裏有什麼? – 2012-05-01 14:51:26

+0

_layers數組包含可視圖形,它們實際上是我繪製的地圖的不同類型的道路,在單個圖像上呈現。 – 2012-05-05 14:40:28

回答

2

我不得不做類似的事情,前一段時間,我必須寫我自己的GIS應用。我不得不繪製成千上萬的繪圖視覺效果,我的發現是,RenderTargetBitmap不適合位圖操作,因爲它沒有使用圖形硬件加速。 Silverlight有一個更適合的類; WriteableBitmap它允許您的應用程序直接寫入GPU緩衝區。唯一的問題是,它僅適用於Silverlight。如果你想堅持爲你的操作使用位圖,那麼你可以使用相當於WriteableBitmap的WPF,這是WriteableBitmapEx可用的here

由於總共只有6個繪圖視覺效果,因此我建議您轉而使用更高級別的UI元素,例如Shapes等。

+1

我不能使用WriteableBitmapEx作爲DrawingBrush,我無法繪製控件。 – lindexi 2017-06-21 01:03:50

2

使用Render顯示可視對象不是一個好的解決方案。如果你有一個Canvas並且你想渲染你的視覺效果,你不需要將視覺效果轉換成位圖,而且如果你進行了轉換,你的圖像不能被縮放任何數量而不會降低質量(矢量圖形的特性) 。還有另一種可能性:創建自己的畫布。我目前使用這種方法,並沒有問題繪製成千上萬的形狀。這是一個很簡單的例子:

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

} 

使用DrawingCanvas而不是Canvas類。