WPF复选框状态不会在FixedPage中更新 [英] WPF Checkbox state does not update in FixedPage

查看:309
本文介绍了WPF复选框状态不会在FixedPage中更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图导出一些基于FixedPage元素用作WPF中的模板的数据,我似乎有问题更新复选框的值。奇怪的部分是,我也使用Textblocks和Textboxes在我的模板,但是这些没有问题更新其内容。

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. The weird part is that I am also using Textblocks and Textboxes in my template, but these have no problem updating their content.

所以...从头开始。我想导出的数据是在一个名为RepairStatement的类,它允许使用printForm函数打印到自定义xps文件。

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.

    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模板看起来像这样: / p>

The xaml template I am using looks like this:

<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>

问题出在这3 printForm函数中的行:

The problem is in these 3 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;

前两行正常修改文本框的内容。我也可以修改Textblocks的内容没有问题,但复选框的值不会改变,无论我试图做什么。我认为这是与FixedPage或FixedDocument,但我不能知道什么问题可能是。如果我在XAML中设置IsChecked =True,复选框将在最终的xps文档中显示为选中状态,但类似地,我不能取消选中它。

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. I assume it is something to do with FixedPage or FixedDocument, but I cannot fathom what the problem may be. If I set IsChecked="True" in XAML the checkbox will appear as checked in the final xps document, but similarly I cannot uncheck it.

任何关于可能出错的提示都将非常感谢。如果你知道固定页面和固定文档的好的教程或信息来源,我也想看看他们,因为我发现迄今为止的文档是谦虚说至少。

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.

谢谢!

更新:
我也在msdn论坛问了一个问题这里,并得到一些提示关于使用Measure(),Arrange和updatelayout( ),然后导出到xps。不幸的是,这个解决方案似乎不工作。我认为这将是一个远射,考虑到textblock和textbox元素的行为正如预期,我只有复选框的问题。

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. 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.

我决定做一个小项目,显示错误,使您也可以自己尝试一点。您可以在此处找到它。

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.

让我知道如果你想出来的东西:D

Let me know if you figure something out :D

推荐答案

我发现了问题,开始的解决方案。

I have found the problem and I have also found some beginning of a solution.

显示启用的复选框在导出到wpf时不检查。我想开发人员的想法,当他们写的代码是一张纸上的启用复选框只应手动检查。最不幸的是对我来说,我想以编程方式检查它们。

Apparently enabled checkboxes do not check when exported to 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!

这篇关于WPF复选框状态不会在FixedPage中更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆