Manoj_Baddi Ответов: 1

Экспортируйте все содержимое сетки в изображение(а не только в видимую область)


Мне нужно написать универсальный код, чтобы экспортировать содержимое пользовательских элементов управления/сетки в формате PNG.
напр.:
<Grid>
   <dockPanel>
     <Textblock>......<Textblock>
   <dockPanel>

<scrollViewer>
  <listView>
  .....
  </listview>
</scrollViewer>

<chart>....</chart>
......
<Grid>

Мне нужно экспортировать вышеописанный пользовательский интерфейс в PNG.

Что я уже пробовал:

public void ExportToPNG(FrameWorkElement element, Stream stream)
{
BitmapEncoder encoder = new PngBitmapEncoder();
	var bitmap = new RenderTargetBitmap(
				(int)element.RenderSize.Width,
				(int)element.RenderSize.Height,
				96,
				96,
				PixelFormats.Default);

Rect bounds = VisualTreeHelper.GetDescendantBounds(element);

			DrawingVisual drawingVisual = new DrawingVisual();
			using (DrawingContext context = drawingVisual.RenderOpen())
			{
				VisualBrush brush = new VisualBrush(element);
				Rect rect = new Rect(0, 0, bounds.Width, bounds.Height);

				context.DrawRectangle(Brushes.White, null, rect);
				context.DrawRectangle(brush, null, rect);
			}
bitmap.Render(drawingVisual);
encoder.Frames.Add(bitmap);
encoder.Save(stream);
}


Приведенный выше код работает. Но это просто экспорт видимой области(из ScrollViewer). Мне нужно экспортировать весь контент из ScrollViewer.

Примечание: некоторые виды могут не иметь ScrollViewer

Любые советы или рекомендации будут очень признательны!

Спасибо!

1 Ответов

Рейтинг:
1

Gerry Schmitz

Показывать рутину, а не "вызов" бесполезно.

Судя по звукам, вы передаете рутине "средство просмотра прокрутки", а не фактическое "содержимое" (средства просмотра прокрутки). Это "визуальное" (содержащееся в зрителе), что имеет значение.


Manoj_Baddi

Да, я не передаю содержимое scrollviewer. Я передаю всю сетку этой функции(я передаю это как свойство зависимости типа FrameWorkElement). Мне нужно экспортировать все содержимое сетки(а не только scrollviewer).

Я попробую эту идею; каждый раз проверяйте, имеет ли элемент тип scrollviewer и передайте "содержимое" scrollviewer в VisualBrush.