首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF复选框状态在FixedPage中不会更新

WPF复选框状态在FixedPage中不会更新
EN

Stack Overflow用户
提问于 2012-11-14 03:40:12
回答 2查看 1.2K关注 0票数 4

我正在尝试导出一些基于FixedPage元素的数据,在WPF中用作模板,我似乎在更新复选框的值时遇到问题。奇怪的是,我还在模板中使用了Textblock和Textboxes,但它们在更新内容方面没有问题。

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

代码语言:javascript
复制
    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模板如下所示:

代码语言:javascript
复制
<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行代码中:

代码语言:javascript
复制
            //  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;

前两行照常修改textbox的内容。我也可以毫无问题地修改Textblock的内容,但是无论我尝试做什么,复选框的值都不会改变。我认为这与FixedPage或FixedDocument有关,但我无法理解问题可能是什么。如果我在XAML中将IsChecked=设置为“True”,则在最终的xps文档中复选框将显示为选中状态,但类似地,我无法取消选中它。

任何关于可能出错的提示都将不胜感激。如果你知道关于FixedPage和FixedDocument的很好的教程或信息源,我也很想看一看,因为到目前为止我找到的文档至少可以说是简陋的。

谢谢!

更新:我也在msdn论坛here上问了这个问题,在导出到xps之前,我得到了一些关于使用Measure(),Arrange和updatelayout()的提示。不幸的是,这个解决方案似乎不起作用。考虑到textblock和textbox元素的行为符合预期,并且我只对复选框有问题,我确实认为这是一个遥远的尝试。

我决定做一个小项目来展示这个bug,这样你也可以自己做一些实验。你可以在here上找到它。

如果你想出了什么,请告诉我:D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-10 21:34:44

我已经找到了问题所在,也找到了一些解决方案的开始。

在导出到wpf时,显然已启用的复选框不会选中。我猜开发人员在编写代码时的想法是,在一张纸上启用复选框只应手动选中。对我来说最不幸的是,我想通过编程来检查它们。

我也找到了这个问题的一些解决方案。禁用的复选框显示为选中和未选中。当然,最大的缺点是它们都是灰色的,就像被禁用的复选框应该是这样的。

好吧..。我想是时候弄清楚如何重新设置我禁用的复选框的样式,使其看起来像是启用的。嗯……也许可以把五个放在一起打印?祈祷吧!

票数 2
EN

Stack Overflow用户

发布于 2015-02-27 04:39:00

同样的问题也发生在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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13367557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档