2014-02-20 4 views
0

В моем приложении у меня есть потребность в генерации разных отчетов. Большинство из них помещаются на одной странице. Я создал эти отчеты с помощью 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? Либо перед первой категорией, которая вызовет переполнение. Или даже лучше внутри категории, которая вызовет переполнение.

Спасибо за любые предложения и советы! Если какая-либо другая информация необходима, не стесняйтесь спрашивать.

ответ

1

Я сам изучал FixedDocument как решение, позволяющее копировать с экрана статистики.

Класс FixedDocument по определению является WYSIWYG, что означает, что содержимое на каждой странице явно определено; вы точно определяете, какой контент хотите на странице, а затем добавляете этот PageContent в FixedDocument. По дизайну содержание будет не поток со страницы на страницу.

Поскольку, как вы говорите, ваши категории «переполнены», вы уже были на пути к решению ... вы хотите использовать FlowDocument вместо FixedDocument. FlowDocument будет передавать ваш контент на основе самого содержимого, а также размера шрифта и другого контекста.

+0

karfus, спасибо за ваш ответ! Я также подумал об использовании FlowDocument. Это довольно давно, так как я разместил вопрос, но я помню, что там, где некоторые моменты, почему я не мог использовать FlowDocuments. Теперь я собираю отдельные страницы в FixedDocument на лету по коду. Это немного больше работы, но я могу определить свои собственные правила, когда сделать разрыв страницы. – user2219063

Смежные вопросы