0

我有一个基于 DocumentViewer 的带有自定义控件的 WPF 应用程序。有一个“打印”按钮,它会导致打印机选择对话框。当我选择某个打印机(“novaPDF Lite Server v7”)然后按“打印”按钮时,会显示一个带有打印机设置的对话框。该对话框作为单独的应用程序出现在任务栏中。

当我激活该打印机对话框,然后激活其他一些应用程序,然后切换回 WPF 应用程序时,它的客户端(标题栏下方的所有内容)都是白色的。它看起来好像挂了。

在此处输入图像描述

当我关闭打印机设置对话框时,WPF 应用程序开始以正常方式显示(所有控件都在那里)。

我想问题是由打印过程的启动方式引起的。也许它可以通过在单独的线程中进行打印来修复。

现在是这样完成的:

using System.Printing;
using System.Threading;
using System.Windows;
using System.Windows.Controls;

namespace MyControls
{
  public class MyDocumentViewer : DocumentViewer
  {
    [...]
    protected override void OnPrintCommand()
    {
        base.OnPrintCommand();
        this.FirePrintFinished();
    }
    [...]
  }

我能做些什么来解决这个问题?

更新 1 (03.09.2013):更改以MyDocumentViewer异步方式完成打印并没有帮助。

namespace MyControls
{
  public class MyDocumentViewer : DocumentViewer
  {
    [...]
    protected override void OnPrintCommand()
    {
        var worker = new PrintWorker(this);
        Dispatcher.Invoke(new Action(worker.DoWork));
    }
    public void OnPrintCommandBase()
    {
        base.OnPrintCommand();
    }

    [...]
    }

    public class PrintWorker
    {
        private readonly MyDocumentViewer _myDocumentViewer;

        public PrintWorker(MyDocumentViewer myDocumentViewer)
        {
            _myDocumentViewer = myDocumentViewer;
        }

        public void DoWork()
        {
            _myDocumentViewer.OnPrintCommandBase();
            _myDocumentViewer.FirePrintFinished();
        }
    }

  }

更新 2(05.09.2013):只有当我通过远程桌面使用应用程序访问机器时,才能重现该问题(如果我在本地运行程序,则不会发生)。

4

1 回答 1

0

Dispatcher在这里是为了在 UI 线程中Dispatcher.Invoke()运行委托,将在与 Dispatcher 关联的线程上同步运行委托(请参阅msdn)。

您需要的可能是Dispatcher.BeginInvoke(),或者您甚至应该使用BackgroundWorker类来进行真正的后台操作。

我还建议您使用Application.Current.Dispatcher(请参阅此问题:Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

于 2013-10-03T07:49:36.723 回答