Udostępnij za pośrednictwem


Niestandardowy element złożony przy użyciu działania Native

W przykładzie CustomCompositeNativeActivity pokazano, jak napisać obiektNativeActivity, który planuje inne Activity obiekty w celu kontrolowania przepływu wykonywania przepływu pracy. W tym przykładzie użyto dwóch typowych przepływów sterowania, Sequence i While, aby zademonstrować, jak to zrobić.

Przykładowe szczegóły

MySequencePocząwszy od elementu , pierwszą rzeczą, którą należy zauważyć, jest to, że pochodzi z elementu .NativeActivity NativeActivityActivity to obiekt, który uwidacznia pełną szerokość środowiska uruchomieniowego przepływu pracy za pośrednictwem przekazywanego Execute NativeActivityContext do metody .

MySequence Uwidacznia publiczną kolekcję Activity obiektów, które są wypełniane przez autora przepływu pracy. Przed wykonaniem przepływu pracy środowisko uruchomieniowe przepływu pracy wywołuje metodę CacheMetadata dla każdego działania w przepływie pracy. Podczas tego procesu środowisko uruchomieniowe ustanawia relacje nadrzędno-podrzędne na potrzeby określania zakresu danych i zarządzania okresem istnienia. Domyślna implementacja CacheMetadata metody używa TypeDescriptor klasy wystąpienia dla MySequence działania, aby dodać dowolną publiczną właściwość typu Activity lub IEnumerableActivity<> jako elementy podrzędne MySequence działania.

Za każdym razem, gdy działanie uwidacznia publiczną kolekcję działań podrzędnych, prawdopodobnie te działania podrzędne współużytkują stan. Jest to najlepsze rozwiązanie dla działania nadrzędnego, w tym przypadku MySequence, aby uwidocznić również kolekcję zmiennych, za pomocą których działania podrzędne mogą to osiągnąć. Podobnie jak działania podrzędne, CacheMetadata metoda dodaje publiczne właściwości typu Variable lub IEnumerable><Variablejako zmienne skojarzone z działaniem.MySequence

Oprócz zmiennych publicznych, które są manipulowane przez elementy podrzędne MySequenceprogramu , MySequence muszą również śledzić, gdzie znajduje się w wykonywaniu jego elementów podrzędnych. Używa zmiennej prywatnej , currentIndex, aby to osiągnąć. Ta zmienna jest rejestrowana w ramach MySequence środowiska przez dodanie wywołania do AddImplementationVariable metody w MySequence metodzie działania CacheMetadata . Obiekty Activity dodane do kolekcji nie mogą uzyskiwać dostępu do MySequence Activities zmiennych dodanych w ten sposób.

Po MySequence wykonaniu przez środowisko uruchomieniowe środowisko uruchomieniowe wywołuje jego Execute metodę, przekazując NativeActivityContextelement . Jest NativeActivityContext to serwer proxy działania z powrotem do środowiska uruchomieniowego w celu wyłudywania argumentów i zmiennych, a także planowania innych Activity obiektów lub ActivityDelegates. MySequenceInternalExecute używa metody do hermetyzacji logiki planowania pierwszego elementu podrzędnego i wszystkich kolejnych elementów podrzędnych w jednej metodzie. Zaczyna się od wyłudniania .currentIndex Jeśli jest równa liczbie w Activities kolekcji, sekwencja zostanie zakończona, działanie zostanie zwrócone bez planowania żadnej pracy, a środowisko uruchomieniowe przenosi je do Closed stanu . Jeśli wartość currentIndex jest mniejsza niż liczba działań, następny element podrzędny jest uzyskiwany z Activities kolekcji i MySequence wywołuje ScheduleActivitymetodę , przekazując element podrzędny do zaplanowanych i wskazujący CompletionCallback metodę InternalExecute . Na koniec element currentIndex jest zwiększany, a kontrolka jest zwracana do środowiska uruchomieniowego. O ile wystąpienie obiektu podrzędnego MySequence ma zaplanowany obiekt podrzędny Activity , środowisko uruchomieniowe uważa je za w stanie Wykonywanie.

Po zakończeniu działania podrzędnego CompletionCallback jest wykonywane. Pętla będzie kontynuowana od góry. Podobnie jak Execute, element CompletionCallback przyjmuje element NativeActivityContext, dając implementatorowi dostęp do środowiska uruchomieniowego.

MyWhileróżni się od MySequence tego, że planuje pojedynczy Activity obiekt wielokrotnie, a w nim używa wartości logicznej> Activity<TResult><o nazwie Condition , aby określić, czy to planowanie powinno wystąpić. Podobnie jak MySequence, MyWhile używa InternalExecute metody do scentralizowanej logiki planowania. Planuje wartość logiczną Condition<Activity> z wartością logiczną<CompletionCallback<TResult>> o nazwie .OnEvaluationCompleted Po zakończeniu Condition wykonywania jego wynik staje się dostępny za pośrednictwem tego CompletionCallback w silnie typowanym parametrze o nazwie result. Jeśli truemetoda MyWhile wywołuje ScheduleActivitymetodę BodyActivity , przekazuje obiekt i InternalExecute jako element CompletionCallback. Po zakończeniu Body Condition wykonywania programu program zostanie ponownie zaplanowany w InternalExecutepliku , uruchamiając pętlę ponownie. Condition Gdy funkcja zwraca falsewartość , wystąpienie MyWhile polecenia daje kontrolę z powrotem do środowiska uruchomieniowego bez planowaniaBody, a środowisko uruchomieniowe przenosi je do Closed stanu.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Otwórz przykładowe rozwiązanie Composite.sln w programie Visual Studio.

  2. Skompiluj i uruchom rozwiązanie.