我有一个表需要保存为xps(或pdf)文件。为此,我有一个自定义控件,它有一个标题和表本身,这是它在UI中的样子: http://i.stack.imgur.com/kfGlJ.png(抱歉,我不允许发布图片:)) 所以我只是创建一个这个控件的实例,传递一个datacontext,测量,重新排列它并将其作为视觉写入XpsDocument,它应该就这么简单。但是,在结果xps文件中它看起来不同,列的宽度不正确: http://i.stack.imgur.com/vgpcz.png 我还尝试了一个带有GridView的ListView - 同样的故事,列缩小了。 以下是我编写xps文件的方法:
var xpsFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Details.xps");
using (var pack = Package.Open(xpsFileName))
{
using (var doc = new XpsDocument(pack))
{
var dataContext = SeiteDataContextBekommen(0);
var visual = BerichtViewErstellen();
visual.DataContext = dataContext;
visual.Measure(PageSize);
visual.Arrange(new Rect(0, 0, PageSize.Width, PageSize.Height));
visual.UpdateLayout();
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
writer.Write(visual);
}
}
这是DataGrid的Xaml,虽然没有太多东西可以看到:
<DataGrid Grid.Row="2" ItemsSource="{Binding MitarbeiterBestellungen}"
CellStyle="{StaticResource ZelleStyle}"
AlternatingRowBackground="WhiteSmoke"
AutoGenerateColumns="False"
Background="Transparent"
FontSize="12"
GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTextColumn Header="Angebeort" Binding="{Binding Standort}" CellStyle="{StaticResource ZentriertZelleStyle}"/>
<DataGridTextColumn Header="ID" Binding="{Binding MitarbeiterID}"/>
<DataGridTextColumn Header="Mitarbeiter" Width="*" Binding="{Binding Mitarbeitername}"/>
<DataGridTextColumn Header="Menge" Binding="{Binding Menge}" CellStyle="{StaticResource ZentriertZelleStyle}"/>
<DataGridTextColumn Header="Bezeichnung" Width="2*" Binding="{Binding Bezeichnung}"/>
<DataGridTextColumn Header="Preis" Binding="{Binding Preis, StringFormat=\{0:C\}}"/>
<DataGridTextColumn Header="OK" Width="64" CellStyle="{StaticResource OkZelleStyle}"/>
</DataGrid.Columns>
</DataGrid>
我也尝试创建一个paginator并用DocumentPage包装我的UserControl,我尝试使用VisualsCollator for Xps writer,但结果总是一样的。看起来我在这里遗漏了一些非常简单的东西,如果你能帮我找到它,我将不胜感激。
顺便说一句,我必须保存控件而不显示它,因为它应该由Windows服务稍后完成。
P.S。问题是我在某些列中使用* width。我用固定尺寸替换它们,现在可以正确显示。有没有办法让它与* s一起使用?