繁体   English   中英

documentviewer和backgroundworker

[英]documentviewer and backgroundworker

加载和查看我的xps文档工作正常,但加载文档需要很长时间,因为您知道它会导致UI看起来不活动。

XpsDocument xpsDocument = new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read);  
documentViewer1.Document = xpsDocument.GetFixedDocumentSequence();

所以,我试图通过后台工作者加载文档:

private void maintBtn_TouchDown(object sender, TouchEventArgs e) // load and view maint manual
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerReportsProgress = true;
    worker.DoWork += worker_DoWork;
    worker.ProgressChanged += worker_ProgressChanged;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.RunWorkerAsync();
}

void worker_DoWork(object sender, DoWorkEventArgs e) // do work
{
    XpsDocument xpsDocument = new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read);  
    documentViewer1.Document = xpsDocument.GetFixedDocumentSequence();   
}

一旦“Dowork”被执行,ui“崩溃”(完全锁定)。 我似乎无法找到原因。 有没有更好的方法通过后台工作者调用文档? 就像我说的那样,Dowork括号中的代码在后台工作者之外工作得很好,所以我知道代码是正确的。 使用后台工作程序后,它将停止工作。 如果我没有提供足够的信息,请提前原谅我。 我是初级编码员,也是这个网站的新手。

UI中的更改只能从UI线程进行。 例如,除非来自main / ui线程,否则无法访问某些用户控件属性。

我建议:您的IO方法在新任务中运行,但此任务的结果适用于主线程中的UI控件。

我不知道什么是XpsDocument ,但我认为这应该工作:

  private async void maintBtn_TouchDown(object sender, TouchEventArgs e) // load and view maint manual
    {
        XpsDocument xpsDocument = await Task.Run(() => new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read));
        documentViewer1.Document = xpsDocument.GetFixedDocumentSequence();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM