Используя Silverlight 4, возможно ли напечатать сетку в альбомном режиме и показать весь контент? Мы создаем «страницу» как Grid
и устанавливаем транспонированную высоту / ширину из PrintableArea в PrintDocument. Затем мы применяем CompositeTransform
, чтобы установить Rotation и TranslateX. По сути, это очень похоже на решение , найденное здесь .
При этом содержимое корректно поворачивается, и все отображается растягивающимся по ширине (в данном случае и по высоте) страницы, но нижняя часть обрезается. Это почти как содержимое, отображаемое на нормальной ширине страницы (обычно шириной 8,5 дюйма), хотя оно отображается на высоте страницы (высота 11 дюймов). Таким образом, содержимое в 2,5 "выходит в виде пустого содержимого внизу страницы.
Примечание: Мы не вытаскиваем существующий визуальный элемент из пользовательского интерфейса для помещения в "страничную" сетку. Мы определяем DataTemplates
и передаем виртуальные машины в DataContext. Все содержимое привязывается и отображается правильно, насколько это возможно, но рендеринг в печатный документ - это то, что идет не так.
Есть что-то, чего мы упускаем? Мы надеемся, что сначала не нужно отображать растровое изображение страницы, но если это то, что мы должны сделать ...
ОБНОВЛЕНИЕ: Основываясь на дальнейшем расследовании (и разговоре с парнем из команды, которая начала работать над отчетами), код очень сильно основан на Печать Пита Брауна на стороне клиента, Мы немного расширили его для группировки и улучшения функций отчета, но в целом обработка макетов - это тот же механизм.
Если вы посмотрите на код Пита Брауна, мы используем текущую разницу в методе GetNewPage
:
...
this.CurrentPageNumber++;
Grid pagePanel = new Grid();
LayoutTransformer layoutTransformer = new LayoutTransformer
{
Content = pagePanel,
Tag = this.CurrentPageNumber
};
if (printableArea.Height > printableArea.Width)
{
// printable area is in Portrait mode.
layoutTransformer.Height = printableArea.Width;
layoutTransformer.Width = printableArea.Height;
var transform = new CompositeTransform
{
Rotation = 90,
TranslateX = printableArea.Width,
ScaleX = 1,
ScaleY = 1
};
layoutTransformer.LayoutTransform = transform;
layoutTransformer.ApplyLayoutTransform();
layoutTransformer.RenderTransform = transform;
}
else
{
// printable area is in Landscape mode
layoutTransformer.Height = printableArea.Height;
layoutTransformer.Width = printableArea.Width;
}
Size pageSize = new Size(layoutTransformer.Width, layoutTransformer.Height);
layoutTransformer.HorizontalAlignment = HorizontalAlignment.Stretch;
layoutTransformer.VerticalAlignment = VerticalAlignment.Stretch;
RowDefinition headerRow = new RowDefinition { Height = GridLength.Auto };
RowDefinition itemsRow = new RowDefinition { Height = new GridLength(1, GridUnitType.Star) };
RowDefinition footerRow = new RowDefinition { Height = GridLength.Auto };
pagePanel.RowDefinitions.Add(headerRow);
pagePanel.RowDefinitions.Add(itemsRow);
pagePanel.RowDefinitions.Add(footerRow);
...
Это прекрасно работает при автоматическом вращении контента, но ширина по-прежнему уменьшается, как будто она отрисовывает ширину страницы как Портрет. Даже если я изменил все измерения, чтобы поменять местами. Кажется, что вызовы InvalidateMeasure()
и InvalidateArrangement()
не имеют значения для изменения выхода. Странно то, что когда я изменяю ScaleX
на значение, большее 1, оно растягивает обрезанное содержимое, чтобы заполнить большую часть страницы. Таким образом, почти как родительский контейнер обрезается до преобразования, несмотря на то, что в коде указано иное. В основном это похоже на вырезку, которую Шон Вильдермут написал в блоге о . Поэтому я все еще ищу идеи / решения ...