强制加载WPF Visual的适当方法

时间:2013-04-25 21:24:13

标签: c# .net wpf printing

我一直在努力使用System.Printing命名空间进行打印。我终于弄明白,当我使用部分API时,我得到空白结果的原因是因为我试图打印的Visual个对象没有加载/初始化。如果我通过将Visual个对象放入适当大小的Window并在打印前调用Show()来显示它,那么我会得到预期的结果。

因此,我想到的解决方法是为每个Visual

调用此方法
public static void ShowVisual(Visual visual)
{
    Window window = new Window
        {
            Content = visual,
            SizeToContent = SizeToContent.WidthAndHeight,
            Visibility = Visibility.Hidden
        };
    window.Show();
    window.Close();
}


这看起来像是一个黑客,特别是因为用户简单地看到了Window-frame draw。我认为应该有一种不同的方式应该完成。但是,我没有提出任何其他解决方案。使用隐藏的窗口真的应该在这里完成吗?

使用WPF - Get size of UIElement in Memory?中所述的MenuItem不起作用。我看了Force rendering of a WPF control in memory,但我并不是真的想要将Visual渲染成一个位图,这似乎就是这样的。如wpf force to build visual tree中所述,在ApplyTemplate()上拨打Image无效。


编辑:这是从上面使用的解决方案而不是ShowVisual

/// <remarks>
/// This method needs to be called in order for 
//  the element to print visibly at the correct size.
/// </remarks>
private static void ArrangeElement(UIElement element)
{
    var box = new Viewbox {Child = element};

    box.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    box.Arrange(new Rect(box.DesiredSize));
}

3 个答案:

答案 0 :(得分:4)

要打印的项目需要添加到WPF中的可视树中,以便在要显示/打印或以其他方式显示的可视化树中的所有元素上调用“测量”和“排列”过程。

我暂时没有这样做,但您可能会发现在后台将这些项目添加到ViewPort然后打印它们可以解决问题。这应该可以解决在屏幕上实际显示它们的需要,从而使用户看到它们同时也强制进行测量/排列过程。

答案 1 :(得分:3)

我遇到了同样的问题。在我的情况下,我只是在尝试使用它之前调用: Visual.UpdateLayout()。正如Jammer所说,它会自动强制进行测量/排列过程。

我是在窗户上做的。如果您有任何问题,可能应该在调用UpdateLayout()之前设置视觉高度和宽度。

埃里克

答案 2 :(得分:0)

我有同样的问题。由ApplyTemplate()解决。

强制构建Framework元素的可视化树。