- 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