powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Печать Canvas
2 сообщений из 2, страница 1 из 1
Печать Canvas
    #39038306
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла неприятная проблемка.
На форме есть Border, внутри лежит Grid. Динамически формируются Canvas-ы, которые добавляются в Grid

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
var scaleTrans = new ScaleTransform();
var xBinding = new Binding("Value") { ElementName = "zoom" };
var yBinding = new Binding("Value") { ElementName = "zoom" };

BindingOperations.SetBinding(scaleTrans, ScaleTransform.ScaleXProperty, xBinding);
BindingOperations.SetBinding(scaleTrans, ScaleTransform.ScaleYProperty, yBinding);

var canvas = new Canvas
{
    Background = Brushes.White,
    Margin = new Thickness(0,10,0,10),
    Effect = new DropShadowEffect
    {
        Color = Colors.Gray,
        Opacity = 0.5,
        ShadowDepth = 3
    },
    LayoutTransform = scaleTrans
};

SetCanvasSize(PageOrientation, canvas);
mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
mainGrid.Children.Add(canvas);
Grid.SetRow(canvas, mainGrid.RowDefinitions.Count - 1);



На канвасе рисуется таблица сданными через Border(яцейка) и TextBlock(содержимое ячейки). Далее делаю печать канваса. И вот тут затык. Я создал класс, наследник DocumentPaginator
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
class Paginator : DocumentPaginator
{
    private readonly List<Canvas> pageList = new List<Canvas>();

    public void AddPage(Canvas canvas)
    {
        pageList.Add(canvas);
    }

    public override DocumentPage GetPage(int pageNumber)
    {       
        return new DocumentPage(pageList[pageNumber]);
    }

    public override bool IsPageCountValid
    {
        get { return true; }
    }

    public override int PageCount
    {
        get { return pageList.Count; }
    }

    public override Size PageSize
    {
        get
        {
            return new Size(pageList.FirstOrDefault().Width, pageList.FirstOrDefault().Height);
        }
        set
        {
            throw new NotImplementedException();
        }
    }

    public override IDocumentPaginatorSource Source
    {
        get { return null; }
    }
}


Печать:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
    var paginator = new Paginator();
    foreach (UIElement item in mainGrid.Children)
    {
        var canvas = item as Canvas;
        if (canvas == null) continue;
        paginator.AddPage(canvas);
    }
    printDialog.PrintDocument(paginator, "Demo Print");
}


Печать делаю в XPS файл. И получаю сдвиг содержимого, координаты считаются относительно Grid на котором лежат канвасы. Например, на канвасе лежит ячейка, у которой координаты (10,10). Сам канвас относительно грида (400, 20). В результате печати получаю лист, где ячейка сдвинута на (410, 30). Т.о. часть данных обрезается.
Помогите, что что поправить?
...
Рейтинг: 0 / 0
Печать Canvas
    #39038651
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проблему. В классе Paginator замели метод
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public override DocumentPage GetPage(int pageNumber)
{
    // Save current canvas transform
    var canvas = pageList[pageNumber];

    var transform = canvas.LayoutTransform;
    canvas.LayoutTransform = null;

    // fix margin offset as well
    var margin = canvas.Margin;
    canvas.Margin = new Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top);

    // Get the size of canvas
    var size = new Size(canvas.Width, canvas.Height);

    // force control to Update
    canvas.Measure(size);
    canvas.Arrange(new Rect(size));

    var doc = new DocumentPage(canvas);

    // return values as they were before
    canvas.LayoutTransform = transform;
    canvas.Margin = margin;
           
    return doc;
}
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Печать Canvas
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]