2012-11-13 30 views
4

我想導出一些基於固定頁面元素的數據作爲模板在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

+0

實現策略中描述的策略的小項目可以在這裏找到(https://dl.dropbox.com/u/3346930/FixedPagePrintingTest.zip)。 – Cami

回答

2

我已經找到了問題,我也找到了解決的一些開始。

顯然啓用複選框不檢查導出到wpf時。我猜開發人員編寫代碼時的想法是,只能手工檢查複選框在一張紙上。最不幸的是,我想以編程方式檢查它們。

我也發現了一些解決這個問題的方法。禁用的複選框顯示爲已選中或未選中。當然,主要缺點是它們全都變灰,像禁用複選框應該看起來像。

嗯......我想是時候弄清楚如何重新設置我禁用的複選框,使它們看起來像是啓用了。嗯....也許是將五個打印在一起?手指交叉!

+0

我收回。在進一步的實驗中,我發現問題在我嘗試過的任何Windows 8計算機上都不是問題。因此,我認爲這是我後來解決的.NET版本中的一個錯誤。 – Cami

+1

我有同樣的問題,並發現即使您具有相同的.NET Framework,Windows 8與Windows 7上的複選框行爲也有一些差異。我複製了複選框的ControlTemplate作爲本地模板,並刪除了引用「IsEnabled」的樣式觸發器部分,然後該複選框不再變灰,並且複選標記在打印中呈現得很好。 –

1

RadioButtons發生同樣的問題。我通過在打印之前在PrintPreview窗口中顯示我的FixedDocument(使用DocumentViewer)來解決此問題(鏈接:http://www.nbdtech.com/Blog/archive/2009/07/09/wpf-printing-part-4-ndash-print-preview.aspx)。

編輯:幾乎半年後回到這個問題。我的應用程序的需求發生了變化,我不得不實施無聲打印,這不再允許我使用上述的PrintPreview窗口解決方法。該解決方案最終與另一個答案中提到的類似。我最終添加了自定義複選框/單選按鈕模板,並禁用了IsEnabled樣式觸發器。問題是找到Aero BulletChrome模板。下面的問題在這方面有所幫助:https://stackoverflow.com/a/24863563/1288473

相關問題