简体   繁体   English

固定页面中的WPF复选框状态不会更新

[英]WPF Checkbox state does not update in FixedPage

I am trying to export a some data based on a FixedPage element used as template in WPF and I seem to have problems updating the value of the checkboxes. 我试图基于在WPF中用作模板的FixedPage元素导出一些数据,我似乎在更新复选框的值时遇到问题。 The weird part is that I am also using Textblocks and Textboxes in my template, but these have no problem updating their content. 奇怪的是我在模板中也使用了Textblocks和Textboxes,但这些更新内容没有问题。

So... from the beginning. 所以...从一开始。 The data I want to export is in a class called RepairStatement, which allows printing to a custom xps file using the printForm function. 我要导出的数据位于名为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();
    }
}

The xaml template I am using looks like this: 我使用的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>

The problem is in these 3 lines from the printForm function: 问题出在printForm函数的这三行中:

            //  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 modify the content of the textbox as normal. 前两行正常修改文本框的内容。 I can also modify the content of Textblocks without problems, but the values for the checkboxes do not change, no matter what I try to do. 我也可以毫无问题地修改Textblocks的内容,但无论我尝试做什么,复选框的值都不会改变。 I assume it is something to do with FixedPage or FixedDocument, but I cannot fathom what the problem may be. 我认为它与FixedPage或FixedDocument有关,但我无法理解问题可能是什么。 If I set IsChecked="True" in XAML the checkbox will appear as checked in the final xps document, but similarly I cannot uncheck it. 如果我在XAML中设置IsChecked =“True”,则复选框将在最终的xps文档中显示为已选中,但类似地我无法取消选中它。

Any hints as to what might be going wrong would be greatly appreciated. 任何关于可能出错的提示都将不胜感激。 If you know of good tutorials or information sources for FixedPage and FixedDocument I would love to have a look at them as well, since the documentation I have found so far is modest to say the least. 如果你知道有关FixedPage和FixedDocument的好教程或信息来源,我也很想看看它们,因为到目前为止我发现的文档至少可以说是谦虚的。

Thanks! 谢谢!

Update: I also asked the question on the msdn forums here and got some hint about using Measure(), Arrange and updatelayout() before exporting to xps. 更新:我也问这个问题在MSDN论坛上这里并得到了有关使用措施(一些提示),安排和UpdateLayout请()导出到XPS之前。 Unfortunately this solution doesn't seem to work. 不幸的是,这个解决方案似乎不起作用。 I do think it would have been a far shot, considering that textblock and textbox elements behave as expected and I only have problems with checkboxes. 考虑到textblock和textbox元素的行为符合预期,我认为它本来是一个很远的镜头,我只有复选框的问题。

And I decided to make a small project that shows the bug so that you can also experiment a bit on your own. 我决定制作一个显示错误的小项目,这样你也可以自己尝试一下。 You can find it here . 你可以在这里找到它。

Let me know if you figure something out :D 如果你搞清楚了,请告诉我:D

I have found the problem and I have also found some beginning of a solution. 我发现了问题,我也找到了解决方案的一些开端。

Apparently enabled checkboxes do not check when exported to wpf. 显然启用的复选框不会检查导出到wpf的时间。 I guess the developers' idea when they wrote the code is that enabled checkboxes on a piece of paper should only be checked by hand. 我想开发人员在编写代码时的想法是,只能手动检查一张纸上的复选框。 Most unfortunately for me, I want to check them programmatically. 最不幸的是,我想以编程方式检查它们。

I have also found some solution to this problem. 我也找到了解决这个问题的方法。 Disabled checkboxes are shown as checked and unchecked. 已禁用的复选框显示为已选中且未选中。 With the major drawback of course that they're all greyed out, like disabled checkboxes are supposed to look like. 当然主要的缺点是它们都是灰色的,就像残疾复选框一样。

Well... I guess it's time to figure out how to restyle my disabled checkboxes to look like they're enabled. 嗯......我想是时候弄清楚如何重新启动我的禁用复选框,看起来它们已经启用了。 Hmmm.... maybe printing five of them on top of each other? 嗯....也许打印其中五个在彼此之上? Fingers crossed! 手指交叉!

The same issue happens with RadioButtons. RadioButtons也会出现同样的问题。 I solved it by displaying my FixedDocument in PrintPreview window before printing (using DocumentViewer) (link: http://www.nbdtech.com/Blog/archive/2009/07/09/wpf-printing-part-4-ndash-print-preview.aspx ). 我通过在打印前在PrintPreview窗口中显示我的FixedDocument来解决它(使用DocumentViewer)(链接: http ://www.nbdtech.com/Blog/archive/2009/07/09/wpf-printing-part-4-ndash-print -preview.aspx )。

EDIT: Coming back to this question almost half a year later. 编辑:差不多半年后再回到这个问题。 The requirement for my application changed, and I had to implement silent printing, which no longer allowed me to use PrintPreview window workaround mentioned above. 我的应用程序的要求发生了变化,我不得不实现静默打印,不再允许我使用上面提到的PrintPreview窗口解决方法。 The solution ended up being similar to the one mentioned in the other answer. 解决方案最终与另一个答案中提到的解决方案类似。 I ended up adding custom checkbox/radiobutton template, and disabling IsEnabled style triggers. 我最终添加了自定义复选框/ radiobutton模板,并禁用了IsEnabled样式触发器。 The issue is finding Aero BulletChrome template. 问题是找到Aero BulletChrome模板。 The following question helped in that respect https://stackoverflow.com/a/24863563/1288473 以下问题在这方面有所帮助https://stackoverflow.com/a/24863563/1288473

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM