В моем приложении у меня есть потребность в генерации разных отчетов. Большинство из них помещаются на одной странице. Я создал эти отчеты с помощью FixedDocuments. Теперь я пытаюсь создать какую-то букву в FixedDocument. Он содержит, среди прочего, заголовок, бесплатное закрытие и тему. Эти части работают без проблем. Все они разделены на UserControls.Pagebreak внутри Itemscontrol in Fixeddocument
Основное содержание письма дает мне головную боль. Это должен быть вложенный элемент ItemsControl, связанный с пользовательским списком (categoryList). Каждый элемент настраиваемого списка состоит из строки (категории) и другого списка (valueList). Элементы другого списка состоят из двух строк (подпись, значение). ItemsControl выглядит следующим образом:
<ItemsControl ItemsSource="{Binding categoryList}"
DockPanel.Dock="Top"
Margin="20,10,0,0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" Margin="0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding category}"/>
<ItemsControl ItemsSource="{Binding valueList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" Margin="0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding caption}"
Grid.Column="0" />
<TextBlock Text="{Binding value}"
Grid.Column="1" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Если categoryList и Valuelist оба содержат лишь несколько элементов, все работает отлично. Но с определенным количеством элементов элемент ItemsControl получает обрезанный.
Это, как я создаю FixedDocument с помощью кода:
FixedDocument doc = new FixedDocument();
FixedPage page = new FixedPage();
PageContent page1= new PageContent();
//All UserControls are placed inside a DockPanel
DockPanel panel = new DockPanel();
//UserControl with header
Header header = new Header();
DockPanel.SetDock(header, Dock.Top);
panel.Children.Add(header);
//UserControl with complimentary close
Complimentary complimentary = new Complimentary();
DockPanel.SetDock(complimentary, Dock.Top);
panel.Children.Add(complimentary);
//UserControl with subject
Subject subject = new Subject();
DockPanel.SetDock(subject , Dock.Top);
panel.Children.Add(subject);
//UserControl with ItemsControl for categoryList
Categories categories = new Categories();
DockPanel.SetDock(categories,Dock.Top);
panel.Children.Add(categories);
//Add the DockPanel to the page
page.Children.Add(panel);
//Set the PageContent
page1.Child = page;
doc.Pages.Add(page1);
//Set the DataContext for the Binding
doc.DataContext = this.listWithValues;
//Display the result in a DocumentReader
this.reader.Document = doc;
Есть ли способ, чтобы поместить разрыв страницы внутри из ItemsControl? Либо перед первой категорией, которая вызовет переполнение. Или даже лучше внутри категории, которая вызовет переполнение.
Спасибо за любые предложения и советы! Если какая-либо другая информация необходима, не стесняйтесь спрашивать.
karfus, спасибо за ваш ответ! Я также подумал об использовании FlowDocument. Это довольно давно, так как я разместил вопрос, но я помню, что там, где некоторые моменты, почему я не мог использовать FlowDocuments. Теперь я собираю отдельные страницы в FixedDocument на лету по коду. Это немного больше работы, но я могу определить свои собственные правила, когда сделать разрыв страницы. – user2219063