2016-08-25 7 views
1

xpsドキュメントの読み込みと表示はうまくいきますが、ドキュメントの読み込みに時間がかかり、わかっているようにUIが非アクティブに見えます。だから、documentviewerとbackgroundworker

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

、私は、BackgroundWorkerの通過ドキュメントをロードしようとしています:

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の括弧内のコードは、自分の上にバックグラウンドワーカーの外でうまく働くので、コードが正しいことが分かります。バックグラウンドワーカーを使用すると、バックグラウンドワーカーは動作を停止します。私が十分な情報を含んでいない場合は、事前に私を許してください。私はジュニアコーダーであり、このサイトの初心者です。

+0

ルック:http://stackoverflow.com/questions/1862590/how-to-update-gui-バックグラウンドワーカーは助けてくれるかもしれません。 – BWA

答えて

0

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(); 
    } 
+0

偉大な素晴らしいトリックでした! – user6505984