我在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");**
然而如果我再次按下打印按钮,它将正确打印。我不知道为什么它会在将它移到顶部之前进行打印,因为这是我对它的唯一解释......
请帮助
答案 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");
}