12

我一直在努力使用System.Printing命名空间进行打印。我终于发现,我在使用部分 API 时得到空白结果的原因是因为Visual我试图打印的对象没有加载/初始化。如果我Visual通过将对象放在适当大小的 s 中并在打印之前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();
}


这似乎是一种 hack,尤其是因为用户短暂地看到了 Window-frame draw。我认为应该有一种不同的方式来完成。但是,我没有提出任何其他解决方案。使用隐藏窗口真的应该在这里完成吗?

使用WPF 中所述的 MenuItem - Get size of UIElement in Memory? 不起作用。我查看了内存中 WPF 控件的强制渲染,但我并不是真的想将 Visual 渲染为位图,这似乎就是它的用途。调用wpf force中描述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));
}
4

3 回答 3

4

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

我已经有一段时间没有这样做了,但是您可能会发现将这些项目添加到后台的 ViewPort 中,然后打印它们可以解决问题。这应该解决在屏幕上实际显示它们的需要,因此用户在看到它们的同时也强制测量/排列过程。

于 2013-05-09T10:36:40.227 回答
3

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

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

埃里克

于 2014-04-04T14:17:53.610 回答
1

我遇到过同样的问题。由ApplyTemplate()解决。

它强制构建框架元素的可视化树。

于 2017-09-05T11:18:41.170 回答