Есть две концептуально разные задачи здесь:
- Полиграфическая элемент вынесенным в пользовательском интерфейсе в какой-то момент и
- Рендер элемент исключительно для печати.
Поскольку вы жалуетесь на отсечение краев, я предполагаю, что вы хотите сделать последнее. Для этого я бы не добавил корень макета текущего элемента управления, который, как я подозреваю, вы делаете. Добавьте то, что еще не добавлено в визуальное дерево, или удалите его из родителя перед печатью.
Если вам нужно сначала удалить его по какой-либо причине (возможно, из-за того, что пользователь должен сначала взаимодействовать с ним), затем сохраните элемент в переменной printedPage
, которую вы можете повторно добавить в визуальное дерево события PrintDocument.EndPrint
.
Для основного использования обработчика событий что-то вроде этого:
void HandlePrintPage(object sender, PrintPageEventArgs e)
{
var panel = new Grid();
// get an element to print that is not attached to the visual tree
printedPage = GetDetachedPageToPrint();
panel.Children.Add(printedPage.ReportPage);
// we wrap it in a Viewbox to make it full-page
var viewbox = new Viewbox() { Child = panel };
// we need to have a measure pass
viewbox.Measure(e.PrintableArea);
e.PageVisual = viewbox;
// for more pages, we would need to be more careful
//with parent detachments
e.HasMorePages = false;
}