Опираясь на ответ Дрю, лучше всего измерить и расположить контейнер, который передается методу PrintVisual. Это предотвратит обрезание изображения размером более 8,5 x 11 листов. Вот пример того, как я напечатал изображение, которое было частично видимым на экране:
PrintDialog dlg = new PrintDialog();
bool? result = dlg.ShowDialog();
if (result.HasValue && result.Value)
{
ImageViewer.Measure(new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight));
ImageViewer.Arrange(new Rect(new Point(0, 0), ImageViewer1.DesiredSize));
dlg.PrintVisual(ImageViewer, "Print a Large Image");
}
ImageViewer в моем примере может быть заменен любым контейнером UIElement, таким как панель стека, canvas, grid, ect. Для ImageViewer.Source должен быть установлен BitmapImage, готовый к печати.
Я получил идею с этой страницы:
http://www.switchonthecode.com/tutorials/printing-in-wpf