Добавление Grid/FrameworkElement в ContainerVisual
Ну, это может быть странный вопрос. Но, как говорится в заголовке, вы можете добавить Grid в ContainerVisual. Поскольку Grid наследует Visual, я должен быть в состоянии сделать это через Children.Add.
Зачем мне это нужно? Ну, я использую FlowDocument для печати отчета. Этот отчет должен иметь заголовок, и поскольку Flow Document не поддерживает заголовки, я решил добавить заголовки во время разбивки на страницы, используя решение, найденное в Интернете.
Также, поскольку я не хочу рисовать весь заголовок вручную, но могу редактировать его во время проектирования в дизайнере, я разработал его в отдельном файле как элемент Grid. Так что мой заголовок выглядит примерно так (я его укоротил) примерно так:
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="2cm" Width="18.7cm">
<Grid.Resources>
<!-- some resources -->
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2cm"/>
<ColumnDefinition/>
<ColumnDefinition Width="2cm"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="2">
<Image Source="Logo.jpg"/>
</Border>
<Border Grid.Column="1" Grid.RowSpan="2">
<StackPanel>
<Label Name="staje" Style="{DynamicResource naslov}"></Label>
<Label Name="predmet" Style="{DynamicResource naslov}"></Label>
</StackPanel>
</Border>
<Border Grid.Column="2" BorderThickness="1">
<StackPanel>
<TextBlock>Datum:</TextBlock>
<Label Name="datum">22. 12. 2013.</Label>
</StackPanel>
</Border>
<Border Grid.Column="2" Grid.Row="1" BorderThickness="1,0,1,1">
<StackPanel>
<TextBlock>Strana:</TextBlock>
<Label Name="strana">
1/2
</Label>
</StackPanel>
</Border>
</Grid>
при каждом вызове нумерации страниц я загружаю заголовок, используя следующий код:
public FrameworkElement GetHeaderForPage(int Strana)
{
FrameworkElement header = Application.LoadComponent(new Uri("/Header.xaml", UriKind.Relative)) as FrameworkElement;
Label lblTest = LogicalTreeHelper.FindLogicalNode(header, "staje") as Label;
Label lblPredmet = LogicalTreeHelper.FindLogicalNode(header, "predmet") as Label;
Label lblDatum = LogicalTreeHelper.FindLogicalNode(header, "datum") as Label;
Label lblStrana = LogicalTreeHelper.FindLogicalNode(header, "strana") as Label;
lblTest.Content = KakavTest;
lblPredmet.Content = Predmet;
lblDatum.Content = Datum;
lblStrana.Content = string.Format("{0}", Strana);
return header;
}
И, наконец, в вызове нумерации страниц я размещаю его на странице примерно так:
DocumentPage page = m_Paginator.GetPage(pageNumber);
// Create a wrapper visual for transformation and add extras
ContainerVisual newpage = new ContainerVisual();
FrameworkElement header = headerGen.GetHeaderForPage(pageNumber);
// header.RenderTransform = new TranslateTransform(0, -header.ActualHeight+10);
ContainerVisual smallerPage = new ContainerVisual();
smallerPage.Children.Add(page.Visual);
//smallerPage.Transform = new MatrixTransform(0.95, 0, 0, 0.95,
// 0.025 * page.ContentBox.Width, 0.025 * page.ContentBox.Height);
newpage.Children.Add(smallerPage);
newpage.Children.Add(header);
newpage.Transform = new TranslateTransform(m_Margin.Left, m_Margin.Top);
RenderTargetBitmap bmp = new RenderTargetBitmap((int)m_PageSize.Width, (int)m_PageSize.Height, 96, 96, PixelFormats.Default);
bmp.Render(newpage);
ImageShow show = new ImageShow(bmp);
show.Show();
return new DocumentPage(newpage, m_PageSize, Move(page.BleedBox), Move(page.ContentBox));
Класс ImageShow просто открывает новое окно с изображением, представляющим bmp. Я использовал его, чтобы увидеть, была ли проблема в дальнейшей обработке, которая выполняется для отображения страниц в DocumentViewer. Но так как ImageShow не отображает заголовок Grid, кажется, что я делаю что-то ужасно неправильно.
В КОРОТКОМ: Можете ли вы добавить элемент Grid в ContainerVisual как дочерний элемент и сделать его правильно нарисованным. Или мне нужно нарисовать это от руки?
1 ответ
В конце концов я жестко запрограммировал все вручную. Поэтому нет, все, что выше, чем VIsual и DrawingVisual, не может быть включено в ContainerVisual.