@YaMirok

Как правильно сделать машину состояний на WPF?

Доброго всем времени суток!
Передо мной стоит следующая задача:
Необходимо переписать машину состояний для WPF, которая до этого была сделана при помощи WorkFlow. Основное условие такое, что вьюхи(xaml) должны грузиться динамически из файлов.

Кратко о моем решении:
Есть окно, в него помещен элемент типа Frame. Его свойство Content прибиндино к свойству типа Page CurrentPage у ViewModel. Соответственно DataContext`ом у Frame это мой ViewModel.
В конструкторе ViewModel создается экземпляр машины состояний, В которой запускает бесконечный цикл while в отдельном STA потоке Thread. Этот поток проверяет очередь переходов с определенной периодичностью. Как только он находит запись в очереди переходов происходит загрузка нового состояния. Вьюха гружу так:
using (var fs = new FileStream(ViewFilePath, FileMode.Open))
                    {
                        pageToLoad = XamlReader.Load(fs) as Page;
                    }

Тут никаких проблем. После удачной загрузки вьюхи, вызываем event onStateChanged во ViewModel. Где свойству CurrentPage присваивается значение newState.Page.

Вот тут и возникает проблема. При попытке отобразить новое окно возникает ошибка:

Exception:Thrown: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток." (System.InvalidOperationException)
A System.InvalidOperationException was thrown: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."


Собственно вопрос в этом и заключается. Как побороть эту ошибку, чтобы он отобразил мне CurrentPage?
Хотя возможно в целом подход кривой и кто-то может поделиться более грамотным решением.

Спасибо за внимание. Очень надеюсь на вашу помощь.

Прилагаю исходники тестового проекта:
Тестовый проект
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
@YaMirok Автор вопроса
В общем сделал немного по другому. Состояние новое гружу в том же потоке, где создаю машину состояний. Воспользовался AsyncOperation.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Shwed_Berlin
@Shwed_Berlin
.net Software Developer
В одном из проектов реализовал машину состояний с помощью Appccelerate Statemachine.
Все очень просто, для меня оказалось проще чем Workflow Foundation.
В моем случае я обошелся тем же потоком. Подумайте сможете ли вы обойтись одним потоком иначе возникнут те же грабли, ибо проблема у вас с потоком, а не с машиной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы