我制作了一个控件,显示DataGrid中的一些数据 在窗口中使用时,它可以正常工作 当我将它写入Xps文件时,标题会被移动并且 输出错了。 要将它写入XPS,我创建我的控件,然后填写它需要显示的数据。
我使用过这篇文章:Convert WPF (XAML) Control to XPS Document 将控件输出到Xps文件。
我尝试将HeaderRowTemplate设置为固定大小而没有结果。
我还尝试在数据更新后更新布局而没有结果。
列和行是即时计算的,具体取决于哪些数据为非空。
(Rq:垂直和水平属性不相同)
以下是在窗口中加载的一些数据:
时控件的外观
此控件生成的 xps文件 的屏幕截图。
编辑:我终于找到了解决此问题的方法:我添加了一个“打印预览”窗口,其中显示了控件 - 无论如何用户都喜欢 - 我打印'这个(正确的)窗口内容。
答案 0 :(得分:1)
我对DataGrid
遇到了同样的问题,并确定DataGridColumn
的动态宽度(*)是邪恶的根源。在实时应用程序中,一切似乎都很好,但在转换为XPS后,宽度将被忽略。 DataGrid
的总宽度是固定的,因此对我来说,设置固定的宽度new DataGridLength(80.0)
就可以了。默认情况下,它是星形宽度(1 *)。为了能够定义关系列,我写了一个MarkupExtension
,它获得了可用的宽度,列数和“星数”:
<DataGridColumn Width="{local:MyWidth Amount=0.5, Columns=5, TotalWidth=800}" />
此示例的计算结果为:TotalWidth / Columns * Amount
。
这在XPS打印中非常有用。您还可以通过一些爬树来计算总宽度和柱数,并直接在扩展(ActualWidth和Columns.Count)中解析它。
编辑:这是MarkupExtension
[MarkupExtensionReturnType(typeof(double))]
public class MyWidth : MarkupExtension
{
#region Constructors (2)
public MyWidth(double amount, int columns, double totalWidth)
{
this.Amount = amount;
this.Columns = columns;
this.TotalWidth = totalWidth;
}
public MyWidth() { }
#endregion Constructors
#region Properties (3)
[ConstructorArgument("amount")]
public double Amount { get; set; }
[ConstructorArgument("columns")]
public int Columns { get; set; }
[ConstructorArgument("totalWidth")]
public double TotalWidth { get; set; }
#endregion Properties
#region Methods (1)
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this.TotalWidth / (double)this.Columns * this.Amount;
}
#endregion Methods
}