【问题标题】:c# WPF scroll view Prints based on scroll locationc# WPF滚动视图基于滚动位置打印
【发布时间】:2016-02-26 05:00:23
【问题描述】:

我在 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");**

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

请帮忙

【问题讨论】:

  • 尝试将控件实例传递给PrintVisual 方法,而不是包含它的scrollView。
  • 试过还是一样的结果,尝试传递 usercontrol 一个新的用户控件实例一个新的滚动视图实例一切都出来了 saem :(
  • 好的。奇怪的是,从头开始创建的控件的新实例,填充了数据并且从未分配给可滚动容器,在打印时会假定任何 y 偏移量。您确定尝试使用不继承/分配任何容器的新控件实例吗?
  • 它将具有相同的用户控件,也许我误解了你这是我的第一个 WPF 项目,所以在控件方面我有点菜鸟:)

标签: c# wpf scroll


【解决方案1】:

滚动主页后致电UpdateLayout()

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

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

【讨论】:

    【解决方案2】:

    这比实现线程更简单。两个很好的答案

    我无法使用仅由 ScrollViewer 和 Panel 组成的非常小的示例 WPF 应用程序来重现该问题。在黑暗中开枪:尝试在拨打 scrollView.ScrollToHome() 之后拨打 scrollView.UpdateLayout()。 UpdateLayout() 函数的文档说,“确保该元素的所有可视子元素都为布局正确更新。”,这听起来像我们想要的。 – dlatikay

    【讨论】:

      【解决方案3】:

      在打印操作之前更改 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");
      }
      

      【讨论】:

      • 假设一个任意复杂的布局,以及使用 CPU 的其他进程,你的延迟方法会增加它在许多情况下正常工作的机会,但不是一个可靠的修复。
      猜你喜欢
      • 1970-01-01
      • 2019-04-27
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多