我一直在努力使用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));
}