private void DrawGrap_Click(object sender, RoutedEventArgs e)
{
// Visual v = sender as Visual;
Visual v = song2Grid as Visual; // the object (it is a DataGrid) that you want to print out, not a window
PrintDialog prtDlg = new PrintDialog();
if (prtDlg.ShowDialog() == true)
{
// because 96 pixels in an inch for WPF window
double marginLeft = 96.0 * 0.75; // left margin is 0.75 inches
double marginTop = 96.0 * 0.75; // top margin is 0.75 inches
double marginRight = 96.0 * 0.75; // right margin is 0.75 inches
double marginBottom = 96.0 * 0.75; // bottom margin is 0.75 inches
// the following steps do not works for a WPF window
FrameworkElement win = v as FrameworkElement;
Transform oldLayoutTransform = win.LayoutTransform;
Size oldSize = new Size(win.ActualWidth, win.ActualHeight);
System.Printing.PrintCapabilities pCapability = prtDlg.PrintQueue.GetPrintCapabilities(prtDlg.PrintTicket);
// calculate print area that you want
double printWidth = (pCapability.PageImageableArea.ExtentWidth - pCapability.PageImageableArea.OriginWidth)
- (marginLeft + marginRight);
double printHeight = (pCapability.PageImageableArea.ExtentHeight - pCapability.PageImageableArea.OriginHeight)
- (marginTop + marginBottom);
// calculate the scale
double scale = Math.Min(printWidth / oldSize.Width , printHeight / oldSize.Height);
if (scale > 1.0)
{
// keep the original size and layout if printable area is greater than the object being printed
scale = 1.0;
}
// store the original layouttransform
win.LayoutTransform = new ScaleTransform(scale, scale);
// new size of the visual
Size newSize = new Size(oldSize.Width*scale , oldSize.Height*scale);
win.Measure(newSize);
// centralize print area
double xStartPrint = marginLeft + (printWidth - newSize.Width)/2.0;
double yStartPrint = marginTop + (printHeight - newSize.Height)/2.0;
win.Arrange(new Rect(new Point(xStartPrint,yStartPrint),newSize));
// print out the visual
prtDlg.PrintVisual(win as Visual, "PrintTest");
// resotre the original layouttransform and size on screen
win.LayoutTransform = oldLayoutTransform;
win.Measure(oldSize);
win.Arrange(new Rect(new Point(0,0),oldSize));
}
}
Это был ответ на вопрос, заданный пользователем user1018711. Размещение распечатки на одной странице принтера с использованием C # и WPF. Когда вы хотите распечатать визуал, который может быть элементом управления, который может включать множество элементов управления (например, Button, DataGrid, TextBlock, Label и т. Д.). Здесь я хочу напечатать DataGrid с именем song2Drid на принтер, но его содержимое было больше, чем размер страницы принтера (его ширина была шире, чем ширина бумаги), поэтому он был обрезан. Я не мог видеть их все, поэтому мне пришлось масштабировать изображение, но я хотел, чтобы соотношение оставалось таким же, как и у старого.
Я также установил поля бумаги по 0,75 дюйма с каждой стороны листа, слева, сверху, справа и снизу. Я также централизовал визуальное содержание (song2Grid) на бумаге. Таким образом, я мог видеть напечатанный контент только по центру бумаги. Но если визуал представлял собой окно типа Application.Current.MainWindow или любое окно, созданное программно с помощью new Window (), то оно не будет масштабировано. это означало, что этот метод не будет работать для объекта Window.
Кроме того, если вы хотите восстановить исходный вид на экране из измененного путем масштабирования для печати, то вы должны иметь следующие утверждения
win.LayoutTransform = oldLayoutTransform; win.Measure (oldSize); win.Arrange (new Rect (new Point (0,0), oldSize));