C# 打印-如何强制itemssource更新?

C# 打印-如何强制itemssource更新?,c#,.net,wpf,binding,printing,C#,.net,Wpf,Binding,Printing,我有我的自定义控件,它是数独网格。它的行为类似于任何类似listbox或combobox的itemscontrol。项目是单元格。项目绑定到这些单元格的集合。我的控制器自动将这些单元排列成网格(9x9板) 当我用项目放置控件时,一切看起来都很好,单元格都存在 问题是当我尝试使用文档分页器打印控件时。控件已打印,但为空,不存在任何项。看起来控件需要以某种方式重新绘制或通知以更新自身并加载绑定的值。有什么线索吗 这是我在将控件传递给文档分页器之前动态生成控件的方式。ehich用于在页面上放置多个控件

我有我的自定义控件,它是数独网格。它的行为类似于任何类似listbox或combobox的itemscontrol。项目是单元格。项目绑定到这些单元格的集合。我的控制器自动将这些单元排列成网格(9x9板)

当我用项目放置控件时,一切看起来都很好,单元格都存在

问题是当我尝试使用文档分页器打印控件时。控件已打印,但为空,不存在任何项。看起来控件需要以某种方式重新绘制或通知以更新自身并加载绑定的值。有什么线索吗

这是我在将控件传递给文档分页器之前动态生成控件的方式。ehich用于在页面上放置多个控件:

private UIElement generateGridControl(SudokuFile file, int row, int column)
{
    //Contsruct control
    View.GridControl.GridControl grid = new View.GridControl.GridControl();

    //Create sudoku data from provided file
    Grid model = new Grid(file.Type, file.ID);
    model.setValues(file.Data);

    //Create new viewmodel for my control and inject it to control
    grid.init(new GridVM(model), file.Save);

    //Set appearance
    grid.Width = 500;
    grid.Height = 500;
    grid.showLabel(true);

    //Create viewbox used to stretch control to desired size and wrap it around my usercontrol
    System.Windows.Controls.Viewbox box = new System.Windows.Controls.Viewbox
                                                  {Stretch = System.Windows.Media.Stretch.Uniform, Child = grid};


    System.Windows.Controls.Grid.SetRow(box, row);
    System.Windows.Controls.Grid.SetColumn(box, column);

    box.Margin = new Thickness(5);

    return box;
}

用WPF打印仍然让我觉得有点像黑魔法。我遇到了几个陷阱。一种是,如果控件未设置为屏幕的可见部分并允许渲染,则控件往往无法正确打印。例如,如果控件未呈现在屏幕上,布局转换之类的操作将失败。另一件有帮助的事情是对你要打印的项目进行测量和排列

grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
grid.Arrange(new Rect(0, 0, grid.Height, grid.Width));

用WPF打印仍然让我觉得有点像黑魔法。我遇到了几个陷阱。一种是,如果控件未设置为屏幕的可见部分并允许渲染,则控件往往无法正确打印。例如,如果控件未呈现在屏幕上,布局转换之类的操作将失败。另一件有帮助的事情是对你要打印的项目进行测量和排列

grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
grid.Arrange(new Rect(0, 0, grid.Height, grid.Width));

ViewBox需要计算初始布局。召唤

box.UpdateLayout();

generateGridControl
返回之前。请记住,这通常不会强制布局更新,只会影响
IsMeasureValid
IsArrangeValid
为false的元素。无论如何,在这里它会起作用,因为它是初始布局。

ViewBox需要计算初始布局。召唤

box.UpdateLayout();

generateGridControl
返回之前。请记住,这通常不会强制布局更新,只会影响
IsMeasureValid
IsArrangeValid
为false的元素。无论如何,在这里它会起作用,因为它是初始布局。

我根本不知道文档分页器,但我想您的ViewBox永远不会获得完整的布局/渲染周期。在返回之前,请尝试
box.UpdateLayout()
。我完全不知道文档分页器,但我想您的ViewBox永远不会获得完整的布局/渲染周期。在返回之前,请尝试
box.UpdateLayout()
。我确实调用了measure和arange,屏幕上可以看到控件。有可见的绑定项和控件背景,但控件是空的-就像没有包含任何项一样。UpdateLayout不是一个保证修复程序。阅读本MSDN文章末尾的注释。如果您的布局变得更复杂,它可能会开始失败。谢谢您指出这一点。为了我的需要,这应该不是问题。然而,如果有更复杂的布局,这应该是一个问题。有没有办法解决这个问题?不幸的是没有。这是一个我已经考虑过的问题,但我仍然不适应。有一个update complete事件触发,您可以侦听该事件。然而,即使是那件事也没有给我任何信心。因为即使事件自动发生,它也会触发,所以不能保证updatelayout调用是已完成的调用。如果你能找到一个好的解决方案,我很乐意听到。@Mark,我想你已经尝试了所有可能的组合
InvalidateMeasure
invalidaterange
InvalidateVisual
。打印前将控件绘制到
RenderTargetBitmap
中是一种解决方案吗?我确实调用measure和arange,并且控件在屏幕上可见。有可见的绑定项和控件背景,但控件是空的-就像没有包含任何项一样。UpdateLayout不是一个保证修复程序。阅读本MSDN文章末尾的注释。如果您的布局变得更复杂,它可能会开始失败。谢谢您指出这一点。为了我的需要,这应该不是问题。然而,如果有更复杂的布局,这应该是一个问题。有没有办法解决这个问题?不幸的是没有。这是一个我已经考虑过的问题,但我仍然不适应。有一个update complete事件触发,您可以侦听该事件。然而,即使是那件事也没有给我任何信心。因为即使事件自动发生,它也会触发,所以不能保证updatelayout调用是已完成的调用。如果你能找到一个好的解决方案,我很乐意听到。@Mark,我想你已经尝试了所有可能的组合
InvalidateMeasure
invalidaterange
InvalidateVisual
。在打印之前将控件绘制到
RenderTargetBitmap
中是一种解决方案吗?