我想導出一些基於固定頁面元素的數據作爲模板在WPF中使用,我似乎有問題更新複選框的值。奇怪的部分是,我也在我的模板中使用文本塊和文本框,但這些更新內容沒有問題。WPF複選框狀態不更新在固定頁面
因此......從一開始。我想要導出的數據位於名爲RepairStatement的類中,該類允許使用printForm函數打印到自定義xps文件。
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();
}
}
的XAML模板我使用這樣的容貌:
<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>
<!-- Client information -->
<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>
<!-- Name -->
<TextBlock Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Name="clientName"
TextBlock.FontWeight="Bold">
TEST
</TextBlock>
<!-- Phone Number -->
<TextBlock Grid.Column="0" Grid.Row="2">Telefonnummer:</TextBlock>
<TextBlock Grid.Column="2" Grid.Row="2" Name="phoneNumber">TEST</TextBlock>
<!-- Auftragsnummer -->
<TextBlock Grid.Column="0" Grid.Row="3">Auftragsnummer (RMA):</TextBlock>
<TextBlock Grid.Column="2" Grid.Row="3" Name="orderNumber">TEST</TextBlock>
<!-- Receipt Address -->
<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>
<!-- Delivery Address -->
<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" />
<!-- Device information -->
<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>
<!-- Model -->
<TextBlock Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Name="model" TextBlock.FontWeight="Bold">
TEST
</TextBlock>
<!-- Repair -->
<CheckBox Grid.Column="4" Grid.Row="1" Name="hasRepair">Reparatur</CheckBox>
<!-- Device has endorser -->
<CheckBox Grid.Column="4" Grid.Row="2" Name="hasEndorser">Endorsergerät</CheckBox>
</Grid>
</GroupBox>
</DockPanel>
</Border>
</Border>
的問題是從printForm功能這3行:
// 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;
前兩個行按正常方式修改文本框的內容。我也可以毫無問題地修改文本塊的內容,但是不管我嘗試做什麼,複選框的值都不會改變。我認爲這與FixedPage或FixedDocument有關,但我無法弄清楚問題可能出在哪裏。如果我在XAML中設置了IsChecked =「True」,則複選框將在最終的xps文檔中顯示爲選中狀態,但類似地,我無法取消選中它。
任何有關什麼可能會出錯的提示將不勝感激。如果你知道固定頁面和固定文檔的好教程或信息源,我也很想看看他們,因爲我迄今發現的文檔至少是不大可能的。
謝謝!
更新: 我也問了msdn論壇here的問題,並在導出到xps之前獲得了有關使用Measure(),Arrange和updatelayout()的提示。不幸的是,這個解決方案似乎不起作用。我認爲這應該是一個很好的選擇,考慮到textblock和textbox元素的行爲和預期一樣,並且我只對複選框有問題。
我決定做一個小項目來顯示錯誤,以便您也可以自己嘗試一下。你可以找到它here。
讓我知道如果你想辦法的:d
實現策略中描述的策略的小項目可以在這裏找到(https://dl.dropbox.com/u/3346930/FixedPagePrintingTest.zip)。 – Cami