Пользовательский NativeActivity для отображения аргументов в дизайне - PullRequest
1 голос
/ 18 августа 2011

У меня есть собственный NativeActivity с кучей InArguments. Это всегда будет корневое действие, когда клиент редактирует свой рабочий процесс в обновленном конструкторе. Пока все хорошо.

Проблема в том, что, хотя InArguments отображаются в PropertyInspector, вкладка «Аргументы» не отображается. Я понимаю, почему это происходит, но я действительно хочу сделать это NativeActivity корневым действием по ряду причин: я могу настроить его по своему усмотрению, я могу дать ему собственный конструктор и т. Д.

Как я могу иметь свойства аргумента для NativeActivity таким образом, чтобы они отображались на вкладке «Аргументы» в конструкторе, делая их доступными и позволяя клиенту делать все, что он / она хочет, с InArguments без аргумента «» "не объявлено. Может быть недоступно из-за уровня защиты" думаете?

Что я пробовал:

  • Точно так же, как переменные, где мы можем использовать Collection {Variable}, и дизайнер распознает ее как место, где находятся переменные активности, я пробовал Collection {Argument}. Не повезло!
  • Просто напишите InArgument в NativeActivity. Они отображаются в Property Inspector, но не могут быть использованы в рабочем процессе через конструктор. Опять же, они не могут быть разрешены, и "аргумент" не назван ". Он может быть недоступен из-за уровня защиты".
  • Свяжите предыдущие InArguments с RuntimeArguments через CacheMetadata (), используя metadata.AddArgument () и metadata.Bind (). Не повезло вообще.

Я знал, что ActivityBuilder, вероятно, лучший способ решить эту проблему. Я успешно попробовал что-то вроде:

ActivityBuilder builder = new ActivityBuilder();
builder.Implementation = new MyCustomNativeActivity();

DynamicActivityProperty property = new DynamicActivityProperty()
{
 Name = "TestArg",
 Type = typeof(InArgument<string>),
};

builder.Properties.Add(property);

Designer.Load(builder);

Но это приводит к плохому коду, потому что у меня были аргументы при загрузке конструктора. Это препятствует тому, чтобы я имел библиотеку с моими пользовательскими действиями, отделенными от самого кода форм. Главным образом потому, что ActivityBuilder - это запечатанный класс, очень похожий на DynamicActivity, который, я полагаю, тоже будет работать.

Можно ли имитировать поведение ActivityBuilder, позволяющее добавлять свойства во время кода, но используя NativeActivity, который можно легко наследовать и настраивать?

Надеюсь, я ясно дал понять.

П.С .: Я также взглянул на IExecutionProperty, но не очень хорошо понял, как он работает, какова его цель и можно ли его здесь применять.

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 августа 2011

Кажется, что моя проблема известна, и нет планов ее поддержки в следующих выпусках WF.

Ссылки с пояснениями и несколькими обходными путями: здесь и здесь .

0 голосов
/ 19 августа 2011

Не совсем уверен насчет вашей проблемы здесь.Это сказало только вчера, что я решил другую проблему, производный от Деятельности непосредственно и не используя NativeActivity для корня рабочего процесса.Не уверен, что это поможет в вашем случае, но он может просто сделать это.

Так что-то вроде этого:

public class RootActivity : Activity
{
    public InArgument<string> TestArg {get; set;}

    public RootActivity(Activity child)
    {
        Implementation = () => child;
    }
}

Примечание: напечатано в блокноте, поэтому не проверено и будьте осторожны с опечатками

...