4

WPFでテンプレートとして使用されているFixedPage要素に基づいていくつかのデータをエクスポートしようとしていますが、チェックボックスの値を更新する際に問題が発生するようです。奇妙な部分は、テンプレートでテキストブロックとテキストボックスも使用していることですが、これらはコンテンツの更新に問題はありません。

だから...最初から。エクスポートするデータは、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;

最初の2行は、通常どおりテキストボックスの内容を変更します。テキストブロックの内容を問題なく変更することもできますが、何をしようとしてもチェックボックスの値は変わりません。それはFixedPageまたはFixedDocumentと関係があると思いますが、問題が何であるかを理解することはできません。XAMLでIsChecked="True"を設定すると、チェックボックスは最終的なXPSドキュメントでチェックされているように表示されますが、同様にチェックを外すことはできません。

何がうまくいかないかについてのヒントをいただければ幸いです。FixedPageとFixedDocumentの優れたチュートリアルや情報源を知っている場合は、それらも見てみたいと思います。これまでに見つけたドキュメントは控えめに言っても控えめだからです。

ありがとう!

更新:ここのmsdnフォーラムでも質問し、xpsにエクスポートする前にMeasure()、Arrange、updatelayout()の使用に関するヒントを得ました。残念ながら、このソリューションは機能していないようです。テキストブロックとテキストボックスの要素が期待どおりに動作し、チェックボックスにのみ問題があることを考えると、それは遠い道のりだったと思います。

そして、自分で少し実験できるように、バグを示す小さなプロジェクトを作成することにしました。ここで見つけることができます。

あなたが何かを理解したら私に知らせてください:D

4

2 に答える 2

2

私は問題を見つけ、解決策の始まりも見つけました。

どうやら有効なチェックボックスは、wpfにエクスポートされたときにチェックされません。コードを書いたときの開発者の考えは、一枚の紙で有効になっているチェックボックスは手作業でのみチェックする必要があるというものだと思います。私にとって最も残念なことに、プログラムでそれらをチェックしたいと思います。

私はまた、この問題に対するいくつかの解決策を見つけました。無効になっているチェックボックスは、オンとオフの両方で表示されます。もちろん、無効になっているチェックボックスのように、すべてがグレー表示されているという大きな欠点があります。

ええと...無効になっているチェックボックスのスタイルを変更して、有効になっているように見せるための方法を理解するときが来たと思います。うーん....多分それらの5つを互いに重ねて印刷しますか?成功を祈っている!

于 2012-12-10T13:34:44.477 に答える
1

RadioButtonでも同じ問題が発生します。印刷する前に(DocumentViewerを使用して)PrintPreviewウィンドウにFixedDocumentを表示することで解決しました(リンク: http: //www.nbdtech.com/Blog/archive/2009/07/09/wpf-printing-part-4-ndash-print -preview.aspx)。

編集:ほぼ半年後にこの質問に戻ります。アプリケーションの要件が変更され、サイレント印刷を実装する必要がありました。これにより、上記のPrintPreviewウィンドウの回避策を使用できなくなりました。解決策は、他の回答で言及されたものと同様になりました。最終的に、カスタムのチェックボックス/ラジオボタンテンプレートを追加し、IsEnabledスタイルのトリガーを無効にしました。問題は、AeroBulletChromeテンプレートを見つけることです。次の質問は、その点で役立ちましたhttps://stackoverflow.com/a/24863563/1288473

于 2015-02-26T20:39:00.077 に答える