I'm trying to export some data based on the FixedPage element used as a template in WPF, and I seem to have problems updating the value of the checkboxes. The strange part is that I also use text blocks and text fields in my template, but they have no problem updating their contents.
So ... from the very beginning. The data I want to export belongs to the RepairStatement class, which allows printing to a custom xps file using the printForm function.
public class RepairStatement { // Variables public bool hasKulanz { get; set; } public bool hasRepair { get; set; } public Client client { get; set; } /// <summary> /// Export repair statement to XPS file. /// </summary> /// <param name="file">output xps file</param> public void printForm(string file) { string printTemplateRepairStatementPath = "Print Templates\\RepairStatement.xaml"; // Define general purpose handlers to be used in browsing the print templates FileStream fileStream; if (!File.Exists(file)) { FileStream newfile = File.Create(file); newfile.Close(); } // Check that all xaml templates exist if (!File.Exists(printTemplateRepairStatementPath)) { throw new ArgumentNullException(printTemplateRepairStatementPath, "Repair Statement print template is not available. Check file source"); } FixedDocument doc = new FixedDocument(); // A4 Standard: 8.27 x 11.69 inch; 96 dpi Size documentSize = new Size(96 * 8.27, 96 * 11.69); doc.DocumentPaginator.PageSize = documentSize; // 1. Reparatur-Bericht // a. Open the filestream try { fileStream = new FileStream(printTemplateRepairStatementPath, FileMode.Open); } catch (Exception e) { throw new ArgumentNullException(LoginAgent.userSerializationPath, "Repair Statement print template could not be open due to " + e.Message); } // b. Read the XAML tree FixedPage fixedPage = XamlReader.Load(fileStream) as FixedPage; // c. Set the data (fixedPage.FindName("receiptAddress") as TextBox).Text = client.receiptAddress; // Works (fixedPage.FindName("deliveryAddress") as TextBox).Text = client.deliveryAddress;// Works (fixedPage.FindName("hasEndorser") as CheckBox).IsChecked = true; // Has no effect // d. Set the page size fixedPage.Width = doc.DocumentPaginator.PageSize.Width; fixedPage.Height = doc.DocumentPaginator.PageSize.Height; // Add to document PageContent pageContent = new PageContent(); ((IAddChild)pageContent).AddChild(fixedPage); doc.Pages.Add(pageContent); // Convert to XPS XpsDocument xpsDocument = new XpsDocument(file, FileAccess.Write); XpsDocumentWriter documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument); documentWriter.Write(doc); xpsDocument.Close(); } }
The xaml template that I use is as follows:
<FixedPage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="RepairStatementFixedPage" Background="White" Width="793.92" Height="1122.24" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> <Border Name="bigPage" BorderThickness="1" BorderBrush="#FFCB9999" Width="793.92" Height="1122.24" HorizontalAlignment="Center" VerticalAlignment="Center"> <Border Name="content" Margin="96, 96"> <DockPanel LastChildFill="False"> <Grid DockPanel.Dock="Top" Name="title"> <Grid.ColumnDefinitions> <ColumnDefinition Width="120" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="120" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="10" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Image Grid.Column="0" Grid.RowSpan="3" Width="120" Source="/DesktopLibrarian;component/Content/lib-bg.jpg" VerticalAlignment="Top" HorizontalAlignment="Left" /> <TextBlock Grid.Column="1" Grid.RowSpan="3" HorizontalAlignment="Center" VerticalAlignment="Bottom" TextBlock.FontSize="23"> Reparaturbericht </TextBlock> <TextBlock Grid.Column="2" Grid.Row="0" Grid.RowSpan="3" VerticalAlignment="Top" HorizontalAlignment="Right" Name="repairNumber"> TEST </TextBlock> </Grid> <Border DockPanel.Dock="Top" Height="20" /> <Grid DockPanel.Dock="Top" Name="deviceInfo"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> </Grid> <GroupBox DockPanel.Dock="Top" Header="Kundeninformationen"> <Grid Margin="3"> <Grid.ColumnDefinitions> <ColumnDefinition Width="130" /> <ColumnDefinition Width="3" /> <ColumnDefinition Width="110" /> <ColumnDefinition Width="8" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="8" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Name="clientName" TextBlock.FontWeight="Bold"> TEST </TextBlock> <TextBlock Grid.Column="0" Grid.Row="2">Telefonnummer:</TextBlock> <TextBlock Grid.Column="2" Grid.Row="2" Name="phoneNumber">TEST</TextBlock> <TextBlock Grid.Column="0" Grid.Row="3">Auftragsnummer (RMA):</TextBlock> <TextBlock Grid.Column="2" Grid.Row="3" Name="orderNumber">TEST</TextBlock> <TextBlock Grid.Column="4" Grid.Row="1">Rechnungsadresse:</TextBlock> <TextBox Grid.Column="4" Grid.Row="2" Grid.RowSpan="2" Name="receiptAddress" BorderThickness="0" AcceptsReturn="True" TextWrapping="Wrap"> TEST </TextBox> <TextBlock Grid.Column="6" Grid.Row="1">Lieferadresse:</TextBlock> <TextBox Grid.Column="6" Grid.Row="2" Grid.RowSpan="2" Name="deliveryAddress" BorderThickness="0" AcceptsReturn="True" TextWrapping="Wrap"> TEST </TextBox> </Grid> </GroupBox> <Border DockPanel.Dock="Top" Height="20" /> <GroupBox DockPanel.Dock="Top" Header="Geräteinformationen"> <Grid Margin="3"> <Grid.ColumnDefinitions> <ColumnDefinition Width="90" /> <ColumnDefinition Width="3" /> <ColumnDefinition Width="150" /> <ColumnDefinition Width="8" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Name="model" TextBlock.FontWeight="Bold"> TEST </TextBlock> <CheckBox Grid.Column="4" Grid.Row="1" Name="hasRepair">Reparatur</CheckBox> <CheckBox Grid.Column="4" Grid.Row="2" Name="hasEndorser">Endorsergerät</CheckBox> </Grid> </GroupBox> </DockPanel> </Border> </Border>
The problem is these three lines from the printForm function:
// c. Set the data (fixedPage.FindName("receiptAddress") as TextBox).Text = client.receiptAddress; (fixedPage.FindName("deliveryAddress") as TextBox).Text = client.deliveryAddress; (fixedPage.FindName("hasEndorser") as CheckBox).IsChecked = true;
The first two lines change the contents of the text field as usual. I can also change the contents of text blocks without problems, but the values for the checkboxes do not change, no matter what I'm trying to do. I assume this is due to FixedPage or FixedDocument, but I cannot figure out what the problem is. If I set IsChecked = "True" in XAML, then the checkbox will be displayed as marked in the final xps document, but in the same way I can not uncheck it.
Any hints as to what might go wrong would be greatly appreciated. If you know good tutorials or sources of information for FixedPage and FixedDocument, I would also like to look at them, since the documentation that I have found so far is at least modest.
Thanks!
Update: I also asked a question on the msdn forums here and got some hint about using Measure (), Arrange and updatelayout () before exporting to xps. Unfortunately, this solution does not seem to work. I think that would be far, given that the textblock and textbox elements behave as expected, and I only have problems with checkboxes.
And I decided to make a small project that shows an error so that you can also experiment a bit on your own. You can find it here .
Let me know if you understand something: D