Установить DocumentViewer.Document из другого потока? - PullRequest
1 голос
/ 21 июня 2011

У меня есть класс с методом (CreateDocument), который запускает событие в конце. Аргументы события содержат FixedDocument. В моем коде MainWindow я пытаюсь установить DocumentViewer Document как:

void lpage_DocCreated(object sender, LabelDocumentEventArgs e)
{
  this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    new DispatcherOperationCallback(delegate
  {
    FixedDocument fd = e.doc;
    documentViewer1.Document = fd;
    documentViewer1.FitToWidth();
    return null;
  }), null);
}

Я получаю «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им». на линии documentViewer1.Document = fd;

Я могу обновить индикатор выполнения в другом обработчике событий, который запускается тем же методом, пока он работает:

    Int32 progress = Int32.Parse(sender.ToString());
    progBar.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
      new DispatcherOperationCallback(delegate
        {
          progBar.Value = progress;
          return null;
        }), null);

Я не могу понять, почему я не могу установить документ, когда я делаю то же самое, когда устанавливаю значение индикатора выполнения.

1 Ответ

0 голосов
/ 21 июня 2011

Элемент FixedDocument также имеет привязку к потоку.Поэтому, если вы создаете его в отдельном потоке, отличном от documentViewer1, вы получите это исключение.

По существу, все, что происходит от DispatcherObject , имеет привязку к потоку. FixedDocument происходит от DispatcherObject, так же, как элементы управления средства просмотра.

...