保存控件Visual到Xps文件时出现问题

时间:2013-06-19 19:08:51

标签: wpf controls xps

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

我使用过这篇文章:Convert WPF (XAML) Control to XPS Document 将控件输出到Xps文件。

我尝试将HeaderRowTemplate设置为固定大小而没有结果。

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

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

(Rq:垂直和水平属性不相同)

以下是在窗口中加载的一些数据

时控件的外观

Right display, inside a window

此控件生成的 xps文件 的屏幕截图。

ScreenShot of the xps generated

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

1 个答案:

答案 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  
}