Захват / снимок текущего окна содержимого WPF и отправка его на принтер по умолчанию в C# VS 2008
У меня есть приложение MVVM WPF.
Я пытаюсь захватить текущее содержимое окна без границ заголовка и оконной формы.
Я знаю, что это легко сделать в приложении Windows Forms, вот пример.
Я хотел бы сделать то же самое в моем приложении WPF, но я потерян. Я нашел пример здесь, но он захватывает весь экран.
Как я могу это сделать? Кроме того, после захвата мне нужно отправить его напрямую для печати на принтер по умолчанию.
Поэтому я пытаюсь сделать следующее без успеха:
- Захват содержимого окна WPF без границ заголовка и оконной формы.
- Распечатайте этот снимок экрана на принтере по умолчанию, не отображая диалоговое окно печати.
ПОПЫТКА № 1 - ВЫПУСК 1 - Экран захвата: Что касается пункта 1 (захват содержимого окна), который я сделал ниже. Решение SnapShotPNG работает отлично.
Элемент пользовательского интерфейса TopGrid в GetSnapshotButton_Click - это сетка, из которой я хочу сделать снимок его содержимого.
Решение GetJpgImage не работает вообще. На снимке появляются черные зоны. Зачем?
Решения извлечены отсюда и здесь.
private void GetSnapshotButton_Click(object sender, RoutedEventArgs e)
{
var uri = new System.Uri("c:\\Temp\\capture1.png");
SnapShotPNG(TopGrid, uri, 1);
uri = new System.Uri("c:\\Temp\\capture2.jpg");
GetJpgImage(TopGrid, uri, 1, 100);
}
public void SnapShotPNG(UIElement source, Uri destination, int scale)
{
try
{
double actualHeight = source.RenderSize.Height;
double actualWidth = source.RenderSize.Width;
double renderHeight = actualHeight * scale;
double renderWidth = actualWidth * scale;
RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush(source);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(scale, scale));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
}
renderTarget.Render(drawingVisual);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTarget));
using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
{
encoder.Save(stream);
}
}
catch (Exception e)
{
//MessageBox.Show(e);
}
}
///
/// Gets a JPG "screenshot" of the current UIElement
///
/// UIElement to screenshot
/// Scale to render the screenshot
/// JPG Quality
/// Byte array of JPG data
public void GetJpgImage(UIElement source, Uri destination, double scale, int quality)
{
double actualHeight = source.RenderSize.Height;
double actualWidth = source.RenderSize.Width;
double renderHeight = actualHeight * scale;
double renderWidth = actualWidth * scale;
RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush(source);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(scale, scale));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
}
renderTarget.Render(drawingVisual);
JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
jpgEncoder.QualityLevel = quality;
jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
{
jpgEncoder.Save(stream);
}
}
ПОПЫТКА № 2 - ПРОБЛЕМА 1 - Экран захвата: использование решения Dymanoid работает, но с одной проблемой: содержимое не помещается на одной странице. Я пытаюсь сейчас вписаться в одну страницу. Чтобы разместить контент на одной странице, я пытаюсь сделать то, что объясняется здесь.
для печати сетки Cotent (см. здесь):
PrintDialog printDlg = new PrintDialog();
printDlg.PrintVisual(TopGrid, "Grid Printing.");
для печати всего окна wpf (см. здесь):
PrintDialog printDlg = new PrintDialog();
printDlg.PrintVisual(this, "Window Printing.");