C# WPF 滚动视图 基于滚动位置进行打印

本文关键字:滚动 位置 打印 WPF 视图 于滚动 | 更新日期: 2023-09-27 18:36:01

我在 WPF C# 上构建了一个保存发票的应用程序,并创建了一个分配给滚动视图的用户控件。一切都很完美,直到我注意到这个非常令人厌烦的打印错误。

因此,用户控件的大小为 A4。如果在打印时滚动视图滚动到顶部:

 **PrintDialog pd = new PrintDialog();
            pd.PrintVisual(scrollView, "print this off");**

不会出现任何问题。但是,如果滚动视图位于中间或底部,则打印时带有偏移量。我试图通过在打印前将滚动视图移动到顶部来补救它,它这样做了,但打印结果错误......

**scrollView.ScrollToHome();
            PrintDialog pd = new PrintDialog();
            pd.PrintVisual(scrollView, "print this off");**

然而,如果我再次点击打印按钮,它将正确打印。我不知道为什么它会在移动到顶部之前打印,因为这是我对它的唯一解释......

请帮忙

C# WPF 滚动视图 基于滚动位置进行打印

滚动主页后致电UpdateLayout()

scrollView.ScrollToHome();
scrollView.UpdateLayout();

(来自 UpdateLayout() 函数的文档:"确保此元素的所有可视子元素都针对布局进行了正确更新。

就像一个魅力,比实现线程更简单。两个好答案

我无法使用仅由滚动查看器和面板组成的非常小的示例 WPF 应用程序重现该问题。黑暗中的一枪:尝试在打电话给scrollView.UpdateLayout()后打电话给scrollView.ScrollToHome()。UpdateLayout() 函数的文档说,"确保此元素的所有可视子元素都针对布局进行了正确更新",这听起来像我们想要的。- 德拉蒂凯

当我在

打印操作之前更改视觉对象的布局时,我遇到了同样的问题。如果我立即打印,我会得到错误的结果。我猜视觉对象在打印之前没有足够的时间来正确呈现新布局。我像这样修复:

using System.Threading.Tasks;
async void Print() // Use async
{
    PrintDialog pd = new PrintDialog();
    scrollView.ScrollToHome();
    await Task.Delay(TimeSpan.FromSeconds(1.0)); // Wait 1 second scrollView being properly rendered.
    pd.PrintVisual(scrollView, "print this off");
}