Контроль печати и настройка ее положения на странице А4 - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь распечатать выбранный элемент управления в PDF / принтер, но у меня возникла проблема с размещением его на распечатанной странице.

Когда я изменил расположение в Rect, это не влияет на результат. Я хочу, чтобы элемент управления находился в центре страницы, или, по крайней мере, левый верхний угол элемента управления должен быть в левом верхнем углу страницы, но у меня всегда одна и та же картинка, которая начинается в середине страницы.

Это мой код:

private async Task PrintObjectVisual(bool canUserSelectPrinter, FrameworkElement frameworkElement)
{
    if (_CreatePrinterDialog(canUserSelectPrinter, out var prnt)) return;

    var offset = VisualTreeHelper.GetOffset(frameworkElement);

    Transform originalScale = frameworkElement.LayoutTransform.Clone();
    try
    {
        bool allowForceLandscape = true;
        bool forceLandscape =
            allowForceLandscape &&
            (_starMainPage.ActPage.PresPage.PrintLandscape || frameworkElement.ActualWidth > prnt.PrintableAreaWidth)
            ||
            (frameworkElement is IGraphViewControl || frameworkElement is IMapViewControl);

        double scale = 0.0;
        PageMediaSize pageSize = null;
        pageSize = new PageMediaSize(PageMediaSizeName.ISOA4, CmToPx(29.7), CmToPx(21));
        prnt.PrintTicket.PageMediaSize = pageSize;
        if (forceLandscape)
        {
            prnt.PrintTicket.PageOrientation = PageOrientation.Landscape;
            if (pageSize.Width != null && pageSize.Height != null)
                scale = Math.Min(
                    (pageSize.Height.Value / frameworkElement.ActualWidth), (pageSize.Width.Value / frameworkElement.ActualHeight));
        }
        else
        {
            prnt.PrintTicket.PageOrientation = PageOrientation.Portrait;
            if (pageSize.Width != null && pageSize.Height != null)
                scale = Math.Min(
                    (pageSize.Width.Value / frameworkElement.ActualWidth), (pageSize.Height.Value / frameworkElement.ActualHeight));
        }

        //if (scale > 1.0)
        //    scale = 1.0;
        frameworkElement.LayoutTransform = new ScaleTransform(scale, scale);
        // after a thought i know that i might not need it
        //var size = _GetPrintAreaSize(forceLandscape, pageSize);
        //frameworkElement.Measure(size);
        //frameworkElement.Arrange(
        //    new Rect(new Point(0, 0), size));

        prnt.PrintVisual(frameworkElement, $"Printing Object {frameworkElement.Name}");
    }
    catch (Exception e)
    {
        PresHelper.WriteToDebug(_presBaseObject, e);
    }
    finally
    {
        frameworkElement.LayoutTransform = originalScale;

        // after a thought i know that i might not need it
        //Size size2 = new Size(_starMainPage.Canvas.ActualWidth, _starMainPage.Canvas.ActualHeight);
        //frameworkElement.Measure(size2);

        //var x = offset.X - (offset.X * 2);// offset.X
        //var y = offset.Y - (offset.Y * 2);// offset.X

        //frameworkElement.Arrange(new Rect(new Point(x, y), size2));
    }
}

private static bool _CreatePrinterDialog(bool canUserSelectPrinter, out PrintDialog prnt)
{
    prnt = new PrintDialog();
    if (canUserSelectPrinter)
    {
        var result = prnt.ShowDialog();
        if (result == false)
            return true;
    }
    return false;
}

private Size _GetPrintAreaSize(bool forceLandscape, PageMediaSize pageSize)
{
    if (pageSize.Height == null || pageSize.Width == null) throw new NullReferenceException($"Page size values are null! Can't print without it.");

    Size size;
    if (forceLandscape)
        size = new Size(pageSize.Height.Value, pageSize.Width.Value);
    else
        size = new Size(pageSize.Width.Value, pageSize.Height.Value);

    return size;
}

1 Ответ

0 голосов
/ 18 марта 2020

Хорошо, поэтому через некоторое время я решил проблему.

Я присваиваю оригинальные Canvas.LeftProperty и TopProperty некоторым закрытым членам класса, а затем присваиваю свои (двойные) значения. Этот код перед печатью. Позже я назначаю старые значения:

           frameworkElement.LayoutTransform = new ScaleTransform(scale, scale);
            left = (double)frameworkElement.GetValue(Canvas.LeftProperty);
            top = (double)frameworkElement.GetValue(Canvas.TopProperty);
            frameworkElement.SetValue(Canvas.LeftProperty, _marginSize);
            frameworkElement.SetValue(Canvas.TopProperty, _marginSize);

            prnt.PrintVisual(frameworkElement, $"Printing MikObject {frameworkElement.Name}");
        }
        catch (Exception e)
        {
            PresHelper.WriteToDebug(_presBaseObject, e);
        }
        finally
        {
            frameworkElement.SetValue(Canvas.LeftProperty, left);
            frameworkElement.SetValue(Canvas.TopProperty, top);
            frameworkElement.LayoutTransform = originalScale;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...