2015-05-24 3 views
-1

У меня есть приложение MVVM WPF, которое запускает некоторую логику в другом потоке, а затем, когда я хочу сделать обновление пользовательского интерфейса (скрыть основное окно), я вызываю метод Dispatcher.BeginInvoke() и получаю следующую ошибку :Ошибка при вызове диспетчера из приложения WPF

"Must create DependencySource on same Thread as the DependencyObject".

Любые мысли?

Edit:

Следующий код работает в фоновом потоке (игнорировать уродливый код, так как это просто, чтобы продемонстрировать проблемы): В SomeWizardPage конструктору я создаю новый экземпляр класса BitmapImage и настройки это в свойство, связанное с пользовательским интерфейсом - вот что является причиной сбоя. Когда я комментирую инициализацию свойства изображения из конструктора, исключение не выбрасывается.

Main.CurrentViewModel = new SomeWizardPage(); 
if (Main.MainWindow.Dispatcher.CheckAccess()) 
{ 

} 
else 
{ 
    Main.MainWindow.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => 
    { 
     Main.MainWindow.Hide(); 
    })); 
} 

Может кто-нибудь объяснить это поведение? Как я могу это решить?

+0

ваше окно работает на другой поток (то есть другой диспетчер)? –

+3

@ Dikla вам нужно показать код, вызывающий исключение – dkozl

+0

Я добавил дополнительную информацию на свой вопрос - пожалуйста, посмотрите. Благодаря! – Dikla

ответ

3

BitmapImage является DependencyObject. Вы не можете создать экземпляр из фонового потока.

https://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage%28v=vs.110%29.aspx

не должны вы когда-нибудь понадобится, если вы следуете MVVM. BitmapImage принадлежит к представлению.

+0

Спасибо! У меня есть логика, которая определяет, какое изображение будет отображаться в представлении в зависимости от текущего состояния. Эта логика находится в модели представления. Итак, как я могу разместить BitmapImage в представлении с MVVM в таком случае? – Dikla

+0

@ Dikla 'BitmapImage' должен ВСЕГДА быть в' View' без исключений. Это элемент пользовательского интерфейса. Он должен быть привязан к ViewModel. Do ''. Свяжите привязку к ViewModel. – Aron

+0

Я пытался связать UriSource, поскольку вы предложили свойство типа «Uri» в модели представления, но изображение не отображается во время выполнения. Есть предположения? – Dikla

Смежные вопросы