Windows Workflow Foundation - State machine - wykorzystanie do kontroli interfejsu użytkownika

W WF mamy do dyspozycji dwa typy diagramów: sekwencyjny i maszyna stanów. Maszyna stanu umożliwia definiowanie akcji określających przechodzenie między poszczególnymi stanami. Każdy stan składa się z następujących bloków :
- działanie inicjujące stan
- lista zdarzeń które mogą być wykonane w tym stanie
- działanie które jest wykonywane przy wyjściu z danego stanu



Każda obsługa zdarzeń jest to sekwencyjny diagram który realizuje przepływ. Pierwszym elementem który musi być w tym diagramie jest to element który ma zaimplementowany interfejs IEventActivity. W WF są dostępne trzy akcje które go mają , są to: Delay, HandleExternalEvent oraz WebServiceInput. Dla naszego przykładu zrobiłem taki diagram stanu



Mamy dwie metody na obsłużenie kontrolek na formatce ze względu na obecny stan diagramu
1) Wykorzystujemy kolejkę akcji danego stanu. W przybliżeniu każdy stan posiada kolejkę działań które może wykonać. Możemy ją odczytać poprzez użycie metody GetWorkflowQueueData z klasy WorkflowInstance. Zwraca jest nam lista zadań czekający w kolejce. Rzutując właściwość QueueName na klasę EventQueueName możemy pobrać te akcje które czekają na poszczególne zdarzenia.

ReadOnlyCollection<WorkflowQueueInfo> queues = stateMachineInstance.WorkflowInstance.GetWorkflowQueueData();

Collection<string> MessagesAllowed = new Collection<string>();

foreach (WorkflowQueueInfo s in queues)
{
EventQueueName eventQueueName = s.QueueName as EventQueueName;
if (eventQueueName != null)
{
MessagesAllowed.Add(eventQueueName.MethodName);
}
}


A tak wygląda diagram który obsługuje konkretne zdarzenie



Tylko te akcje które wykorzystują kontrolkę HandleExternalEvent przekazują nazwę zdarzenia w
eventQueueName.MethodName. Po tym możemy włączyć lub wyłączyć elementy interfejsu na formatce np.

if (MessagesAllowed.Contains("ButtonPlayPressed"))
this.StartButton.IsEnabled = true;

if (MessagesAllowed.Contains("ButtonPausePressed"))
this.PauseButton.IsEnabled = true;

if (MessagesAllowed.Contains("ButtonStopPressed"))
this.StopButton.IsEnabled = true;

2) Ta metoda opiera się na akcji którą możemy wykonać przy wejściu do danego stanu.
Można tam uruchomić dowolną metodę np z parametrem określający jak jest aktualny stan diagramu i w tym momencie uruchomić jakieś zdarzenie które będzie zaimplementowane w serwisie. Formatka może obsługiwać te zdarzenie i ustawić odpowiednio kontrolki.




Która metoda lepsza? Pierwsza daje możliwość ustawienia elementów interfejsu od oczekujących zdarzeń i tak naprawdę nie jest ściśle powiązania z konkretnym stanem. Druga metoda wymaga zaś przy każdym stanie był kod powiadomi aplikacji w jakim jest stanie diagram aby aplikacja mogła ustawić odpowiednio swoje kontrolki.

Przykład który wykorzystuje obie metody do odpowiedniego przełączania kontrolek jest dostępny tutaj StateMachineUI.zip

0 komentarze:

Prześlij komentarz