gpt4 book ai didi

c# - 强制加载 WPF 视觉对象的适当方式

转载 作者:可可西里 更新时间:2023-11-01 08:26:59 24 4
gpt4 key购买 nike

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


这看起来像是一个 hack,特别是因为用户短暂地看到了 Window-frame 绘制。我认为必须有一种不同的方式来完成它。但是,我没有提出任何其他解决方案。使用隐藏窗口真的应该在这里做什么吗?

使用 WPF - Get size of UIElement in Memory? 中描述的 MenuItem不起作用。我看了Force rendering of a WPF control in memory但我并不是真的想将 Visual 渲染为位图,这似乎就是它的用途。在 Image 上调用 ApplyTemplate(),如 wpf force to build visual tree 中所述没有帮助。


编辑:这是用来代替上面的 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));
}

最佳答案

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

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

关于c# - 强制加载 WPF 视觉对象的适当方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com