c#WPF滚动视图基于滚动位置打印

时间:2016-02-24 19:40:16

标签: c# wpf scroll

我在WPF C#上构建了一个包含发票的应用程序,我创建了一个分配给scrollview的用户控件。 一切都很完美,直到我注意到这个真正令人讨厌的打印错误。

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

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

没有问题发生。但是,如果滚动视图位于中间或底部,则会以偏移量打印。 我试图通过在打印之前将滚动视图移动到顶部来解决它,但它确实如此,但打印出错...

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

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

请帮助

3 个答案:

答案 0 :(得分:0)

这比起实现线程更有魅力和简单。两个好的答案

我无法使用仅包含ScrollViewer和Panel的极小样本WPF应用程序来重现问题。在黑暗中拍摄:在致电scrollView.UpdateLayout()后尝试拨打scrollView.ScrollToHome()。 UpdateLayout()函数的文档说,"确保为布局正确更新此元素的所有可视子元素。",这听起来像我们想要的。 - dlatikay

答案 1 :(得分:0)

滚动回家后调用UpdateLayout()

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

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

答案 2 :(得分:-1)

在打印操作之前更改Visual权限的布局之前,我遇到了同样的问题。如果我立即打印,我会得到错误的结果。我猜Visual在打印之前没有足够的时间来正确渲染新的布局。我这样修好了:

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