gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:47:52 25 4
gpt4 key购买 nike

我正在尝试导出一些基于在 WPF 中用作模板的固定页面元素的数据,并且我在更新复选框的值时似乎遇到问题。奇怪的是,我还在模板中使用了文本 block 和文本框,但这些在更新其内容时没有问题。

所以...从一开始。我想要导出的数据位于名为 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;

前两行照常修改文本框的内容。我还可以毫无问题地修改 Textblocks 的内容,但无论我尝试做什么,复选框的值都不会改变。我认为这与固定页面或固定文档有关,但我无法理解问题所在。如果我在 XAML 中设置 IsChecked="True",复选框将在最终的 xps 文档中显示为已选中,但同样我无法取消选中它。

任何有关可能出现问题的提示将不胜感激。如果您知道有关固定页面和固定文档的优秀教程或信息源,我也很想看看它们,因为至少可以说,到目前为止我找到的文档是适度的。

谢谢!

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

我决定制作一个小项目来显示该错误,以便您也可以自己进行一些实验。可以找到here .

如果你发现了什么,请告诉我:D

最佳答案

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

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

我也找到了解决这个问题的方法。禁用的复选框显示为选中和未选中。当然,主要缺点是它们都是灰色的,就像禁用的复选框应该看起来一样。

嗯...我想是时候弄清楚如何重新设置已禁用的复选框的样式,使其看起来像已启用。嗯……也许可以将其中五个打印在彼此之上?手指交叉!

关于WPF 复选框状态不会在固定页面中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13367557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com