2013-03-12 7 views
13

У меня есть TreeView с маленькими значками, отображаемыми в шаблоне данных. Я пытаюсь сохранить Treeview как PNG, используя RenderTargetBitmap.WPF RenderTargetBitmap Отсутствующие элементы

Изображение правильно сохраняется на небольших наборах данных. Однако, если набор данных становится слишком большим, некоторые значки исключаются из окончательного изображения. Кажется, что волшебное число 200 предметов. Кажется, не имеет значения, является ли дерево глубоким или широким, после 200 предметов значки не отображаются.

Добавлено Код

Так вот мой код, который я использую для создания образа.

 RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
      (int)_treeView.ActualWidth, 
      (int)_treeView.ActualHeight, 
      96, 96, PixelFormats.Default); 

     targetBitmap.Render(_treeView); 

Добавлен Screen Shot

Обратите внимание на недостающие иконки перебросив на правой стороне дерева. Screen shot of missing icons

Теперь, если я разрушаю несколько ветвей, тем самым скрывая некоторые другие значки, тогда эти значки включены. Это похоже на RenderTargetBitmap.Render не имеет возможности отображать все значки. Или это может иметь какое-то отношение к виртуальным панелям. Screen shot of included icons

Подробнее. enter image description here

+0

Можете ли вы попробовать что-то для меня; Просто установите все изображения на изображение 2x2. У вас все еще есть ограничение на 200 предметов? –

+0

@MeirionHughes Whoa! Интересно. В 2x2 никаких значков не отображалось. Я немного увеличил размер, а затем только несколько значков, например 10. Поэтому, когда я задал вопрос, шаблон был установлен в 100x100, поэтому я изменил его на 150x150, и все значки были отображены! Так что же происходит? –

+1

Не знаю ... Очень странно, я соблазн сказать, что у вас есть проблемы с виртуализацией и кэшированием. Вы ничего не делаете с изображениями, например, сохраняете все в одном растровом или что-то в этом роде? –

ответ

4

Что я сразу заметил, что у вас ОГРОМНОЕ изображение. Ширина 12000. Я удивлен, что ты даже получил это близко.

Как указано в MSDN, ширина/высота текстуры ограничены пределами текстуры DirectX.

Максимальный размер визуального дерева XAML ограничен максимальными размерами текстуры Microsoft DirectX; для получения дополнительной информации см. «Ограничения ресурсов» (Direct3D). Это ограничение может варьироваться в зависимости от аппаратного обеспечения приложения. Очень большой контент, превышающий этот предел, может быть масштабирован для соответствия. Если ограничения масштабирования применяются таким образом, размер рендеринга после масштабирования может быть запрошен с использованием свойств PixelWidth и PixelHeight. Например, визуальное дерево XAML размером 10000 на 10000 пикселей может быть масштабировано до 4096 на 4096 пикселей, что является примером конкретного ограничения, вызванного аппаратным обеспечением, на котором работает приложение. http://msdn.microsoft.com/library/windows/apps/dn298548

Я подозреваю, что эти вещи:

  • Виртуализация отрезав некоторые вещи - я имел точные проблемы в прошлом с DataGrid, и проблема была виртуализация. Ваше дело не похоже на одно.
  • Слишком большая текстура может вызвать неопределенное поведение.

Вы можете попробовать отключить аппаратное ускорение. Эта вещь вызывает довольно много хардкорных ошибок. http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode.aspx

Кроме этого - это будет сложно, но я уверен, что он будет работать красиво:

1) начинается с корневого объекта, и траверс корневой объект детско рекурсивно, пока не будет найден объект то есть менее 1000 х 1000. Сфотографируйте его с помощью RenderTargetBitmap (BMP) и объедините его в IN-MEMORY-BMP. Сделайте это для каждого ребенка.

Вы должны уметь рассчитать все это.

+0

Это может быть решение, но мне нужно несколько дней, чтобы проверить. Тем не менее, это очень хороший совет! –

+0

Как упоминалось в моем комментарии, это не связано с виртуализацией: хотя исходный плакат, вероятно, использовал виртуализацию, я окончательно не сделал этого. Я также сомневаюсь, что это связано с аппаратным ускорением, поскольку RenderTargetBitmap не использует аппаратное ускорение. Это не из страницы MSDN RenderTargetBitmap, а из других сообщений в MSDN, где люди жаловались на скорость RenderTargetBitmap. –

+0

О ограничениях ресурсов для 'RenderTargetBitmap'; Если я нацелен на процессор «64 бит», я могу успешно сгенерировать «15000x15000» png-изображение. При попытке создания изображения «30000x30000» возникает ошибка памяти при попытке сохранить png. Попытка «30000x30000» на 32-битном процессоре создает ошибку памяти при создании «RenderTargetBitmap». При попытке создания изображения «60000x60000» возникает ошибка при вызове 'Render()'. Определенная комбинация настроек генерирует общую ошибку GDI + при попытке сохранить.Моя точка зрения: ** ошибки из пределов ресурсов не проглатываются молча ** - поэтому я не думаю, что это ошибка ресурса. –

0

Для записей: существует обходное решение.

Вместо визуализации непосредственно с помощью RenderTargetBitmap используйте промежуточный DrawingVisual. Покрасьте свой Visual в DrawingVisual с помощью VisualBrush, а затем используйте RenderTargetBitmap с DrawingVisual.

Как это:

public BitmapSource RenderVisualToBitmap(Visual visual) 
    { 
     var contentBounds = VisualTreeHelper.GetContentBounds(visual); 

     var drawingVisual = new DrawingVisual(); 
     using (var drawingContext = drawingVisual.RenderOpen()) 
     { 
      var visualBrush = new VisualBrush(visual); 
      drawingContext.DrawRectangle(visualBrush, null, contentBounds); 
     } 

     var renderTargetBitmap = new RenderTargetBitmap((int)contentBounds.Width, (int)contentBounds.Height, 96, 96, PixelFormats.Default); 
     renderTargetBitmap.Render(drawingVisual); 

     return renderTargetBitmap; 
    } 

Однако обратите внимание, что, как ваш визуал становится больше результирующее изображение становится все более и более нечетким (при визуализации с высоким DPI). Чтобы обойти эту проблему, используйте серию меньших «плиток» VisualBrush, как описано здесь: https://srndolha.wordpress.com/2012/10/16/exported-drawingvisual-quality-when-using-visualbrush/

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