Я боролся с печатью, используя пространство имен 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. Я полагаю, что должен быть другой способ, которым это должно быть сделано. Однако я не принимаю никаких других решений. Является ли использование скрытого окна действительно тем, что должно быть сделано здесь?
Использование MenuItem, как описано в WPF - получить размер UIElement в памяти? не работает. Я посмотрел на принудительное рендеринг элемента управления WPF в памяти, но я действительно не хочу визуализировать визуальный образ, который, похоже, является тем, для чего это необходимо. Вызов ApplyTemplate()
на Image
, который, как описано в wpf force для создания визуального дерева, не помог.
EDIT: Это решение, которое используется вместо 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));
}