c#WPF滚动视图根据滚动位置打印

c#WPF滚动视图根据滚动位置打印,c#,wpf,scroll,C#,Wpf,Scroll,我在WPF C#上构建了一个保存发票的应用程序,并创建了一个分配给scrollview的usercontrol。 一切都很完美,直到我注意到这个令人讨厌的打印错误 因此,用户控件的大小为A4。如果在打印时将滚动视图滚动到顶部: **PrintDialog pd = new PrintDialog(); pd.PrintVisual(scrollView, "print this off");** 没有问题发生。但是,如果滚动视图位于中间或底部,则会以偏移量打印。 我曾

我在WPF C#上构建了一个保存发票的应用程序,并创建了一个分配给scrollview的usercontrol。 一切都很完美,直到我注意到这个令人讨厌的打印错误

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

 **PrintDialog pd = new PrintDialog();
            pd.PrintVisual(scrollView, "print this off");**
没有问题发生。但是,如果滚动视图位于中间或底部,则会以偏移量打印。 我曾试图通过在打印前将scrollview移到顶部来解决这个问题,但打印出的结果是错误的

**scrollView.ScrollToHome();
            PrintDialog pd = new PrintDialog();
            pd.PrintVisual(scrollView, "print this off");**
但如果我再次点击打印按钮,它将正确打印。我不知道为什么它会在移动到顶部之前打印,因为这是我对它的唯一解释


请帮助

我以前也遇到过同样的问题,当我在打印操作之前更改视觉布局时。如果我立即打印,我会得到错误的结果。我猜在打印之前,视觉效果没有足够的时间来正确呈现新的布局。我喜欢这样:

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");
}

我以前也有同样的问题,当我在打印操作之前更改视觉布局时。如果我立即打印,我会得到错误的结果。我猜在打印之前,视觉效果没有足够的时间来正确呈现新的布局。我喜欢这样:

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");
}

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


我无法用一个非常简单的WPF应用程序示例来重新解决这个问题,该示例程序只包含一个ScrollViewer和一个面板。暗中拍摄:在调用
scrollView.ScrollToHome()
后,尝试调用
scrollView.UpdateLayout()
。UpdateLayout()函数的文档说,“确保此元素的所有可视子元素都正确地更新以进行布局”,这听起来像是我们想要的dlatikay

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

我无法用一个非常简单的WPF应用程序示例来重新解决这个问题,该示例程序只包含一个ScrollViewer和一个面板。暗中拍摄:在调用
scrollView.ScrollToHome()
后,尝试调用
scrollView.UpdateLayout()
。UpdateLayout()函数的文档说,“确保此元素的所有可视子元素都正确地更新以进行布局”,这听起来像是我们想要的dlatikay

在滚动主页后调用
UpdateLayout()

scrollView.ScrollToHome();
scrollView.UpdateLayout();
(来自UpdateLayout()函数的文档:“确保此元素的所有可视子元素都已正确更新以进行布局。”)

在滚动主页后调用
UpdateLayout()

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

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

尝试将控件的实例传递给
PrintVisual
方法,而不是包含它的scrollView。尝试了同样的结果,尝试向usercontrol传递一个新的用户控件实例一个新的scrollview实例所有内容都显示在saem中:(好的。一个从头创建的控件的新实例,填充了数据并且从未分配给可滚动的容器,在打印时会采用任何y偏移。您是否确定尝试使用一个新的控件实例,而该实例没有继承/分配任何容器?它将具有相同的用户控件,可能我误解了您这是我的第一个WPF项目,所以在控件方面我有点不知所措:)可能相关:尝试将控件的实例传递给
PrintVisual
方法,而不是包含它的scrollView。尝试了同样的结果,尝试了传递usercontrol一个新的用户控件实例一个新的scrollView实例所有内容都显示在saem中:(好的。一个从头创建的控件的新实例,填充了数据并且从未分配给可滚动的容器,在打印时会采用任何y偏移。您是否确定尝试使用一个新的控件实例,而该实例没有继承/分配任何容器?它将具有相同的用户控件,可能我误解了您这是我的第一个WPF项目,所以在控件方面我有点不知所措:)可能相关:假设任意复杂的布局和其他使用CPU的进程,您的延迟方法将增加在许多情况下正常工作的机会,但不是可靠的修复方法。假设任意复杂的布局和其他使用CPU的进程,您的延迟方法将增加在许多情况下正常工作的机会,但这不是一个可靠的解决办法。