Используя Silverlight 4, можно ли распечатать сетку в ландшафтном режиме и показать все содержимое? Мы создаем «страницу» как Grid
и устанавливаем транспонированную высоту/ширину из PrintableArea PrintDocument. Затем мы применяем CompositeTransform
для установки Rotation и TranslateX. По сути, он очень похож на solution found here.Настроить альбомную печать из Silverlight?
Это правильно обрабатывает содержимое, и все появляется, чтобы растянуть ширину (ну, высота в этом случае) страницы, но нижняя часть отсекается. Это почти похоже на содержимое, отображаемое на обычную ширину страницы (обычно 8,5 "), хотя она была отображена на высоту страницы (высота 11 дюймов). Таким образом, содержание содержимого в 2,5 дюйма выводится в виде пустого содержимого в нижней части страницы.
Примечание: Мы не вытаскиваем существующий визуальный элемент из пользовательского интерфейса, чтобы помещать его в «страницу». Мы определяем DataTemplates
и передаем VM в DataContext. Все содержимое привязано и отображается правильно, насколько это возможно, но рендеринг в печатном документе - это то, что не так.
Есть ли что-то, что мы Мы надеемся избежать необходимости сначала отобразить растровое изображение страницы, но если это то, что мы должны сделать ...
ОБНОВЛЕНИЕ: Основываясь на дальнейшем расследовании (и разговаривая с парнем в команде, которая начала работать над отчетами), код очень сильно основан на Pete Brown's client side printing. Мы немного расширили его для группировки и улучшения функций отчета, но в целом обработка макета - это тот же движок.
Если вы посмотрите на код Пита Брауна, текущая разница мы используем следующая в методе 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, он растянет обрезанный контент, чтобы заполнить больше страницы. Таким образом, это почти похоже на то, что родительский контейнер обрезается до преобразования, несмотря на то, что код указывает иначе. В основном это похоже на отсечение, которое Shawn Wildermuth blogged about. Поэтому я все еще ищу идеи/решения ...
Я дам «LayoutTransformer» выстрел, но я обновил информацию об отчетности в вопросе. Не знаю, изменит ли это ваш ответ вообще. –