2012-04-28 3 views
6

В настоящее время у меня есть изображение на холсте, которое я могу свободно перемещать в своем приложении, на котором у меня есть 6 слоев DrawingVisuals, но это выглядит довольно медленно. Я использую RenderTargetBitmap для визуализации. Есть ли более быстрый способ отображения визуальных изображений на изображении или любого другого элемента структуры, который я могу свободно перемещать по холсту?Рендеринг чертежей в 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> 

код:

_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? –

+0

массив _layers содержит графические объекты, которые на самом деле являются разными типами дорог карты, которую я рисую, на одном изображении. –

ответ

2

я должен был сделать подобную вещь некоторое время назад, когда я должен был написать свое собственное приложение ГИС. Мне приходилось рисовать тысячи и тысячи графических изображений, мои выводы заключались в том, что RenderTargetBitmap не является хорошим выбором для операций с растровыми изображениями, поскольку он страдает от использования графического аппаратного ускорения. Silverlight имеет более подходящий класс; WriteableBitmap, который позволяет вашему приложению напрямую записывать в буфер GPU. Единственная проблема заключается в том, что он доступен только для Silverlight. Если вы хотите использовать растровое изображение для своих операций, вы можете использовать эквивалент WriteableBitmap для WPF, который доступен WriteableBitmapExhere.

Поскольку у вас есть всего 6 рисунков в целом, я предлагаю вам перейти к использованию элемента пользовательского интерфейса более высокого уровня, такого как формы и т. Д.

+1

Я не могу использовать WriteableBitmapEx как DrawingBrush, что я не могу нарисовать элемент управления. – lindexi

2

Показать Визуальные объекты с использованием Render не является хорошим решением. Если у вас есть холст и вы хотите визуализировать визуальную визуальность, вам не нужно преобразовывать визуальные изображения в растровое изображение, также если вы сделаете преобразование, изображение не может быть масштабировано никакими суммами без ухудшения качества (функция векторной графики) , Есть еще одна возможность: создать свой собственный холст. В настоящее время я использую этот метод, и у меня нет проблем рисовать тысячи фигур. Это очень простой пример:

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 класса.

Смежные вопросы