-1

我制作了一个控件,它显示了 DataGrid 中的一些数据。
在窗口中使用时,它可以正常工作。
当我将它写入 Xps 文件时,标题会发生偏移并且输出错误。要将其写入 XPS,我创建了我的控件,然后填写它需要显示的数据。

我使用了这篇文章:将 WPF (XAML) 控件转换为 XPS 文档 以将控件输出到 Xps 文件。

我试图将 HeaderRowTemplate 设置为固定大小,但没有结果。

我还尝试在数据更新后更新布局,但没有结果。

列和行是动态计算的,具体取决于哪些数据是非空的。

(Rq:垂直和水平属性不一样)

以下是在窗口中加载了一些数据的控件的外观:

右侧显示,在窗口内

还有一个从这个控件生成的 xps 文件的屏幕截图。

生成的 xps 的屏幕截图

编辑:我终于找到了解决此问题的方法:我添加了一个“打印预览”窗口,其中显示了控件-无论如何用户都喜欢-并且我“打印”了这个(正确的)窗口内容。

4

1 回答 1

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  
}
于 2013-09-08T16:01:16.633 回答