Действия всегда свернуты в перепроектированном дизайнере - PullRequest
1 голос
/ 16 ноября 2010

Я пытаюсь переназначить конструктор, но каждый раз, когда я добавляю рабочий процесс в конструктор:

_workflowDesigner = new WorkflowDesigner();
// added to UI here
Properties.Content = _workflowDesigner.PropertyInspectorView;
_workflowDesigner.Load(myWorkflowInstance);

, где myWorkflowInstance - рабочий процесс, определенный в ссылочной сборке.Я сделал магию Register, чтобы получить зарегистрированные метаданные активности по умолчанию:

new DesignerMetadata().Register();

, и я зарегистрировал все свои собственные NativeActivities:

public static void Register(IEnumerable<Type> activityTypes)
{            
    // activityTypes are all my custom NativeActivities
    // and all workflows (root of System.Activities.Activity)
    var builder = new AttributeTableBuilder();
    var attrGroups =
        from x in activityTypes
        from y in x.GetCustomAttributes(true).OfType<Attribute>()
        group y by x into g 
        select g;

    foreach (var typeGroup in attrGroups)
        builder.AddCustomAttributes(typeGroup.Key, typeGroup.ToArray());
    MetadataStore.AddAttributeTable(builder.CreateTable());
}

, когда я загружаюактивность в конструкторе вот что я получаю:

Why r u collapsed?

Что мне здесь не хватает?


Я думаю, что это как-то связано стот факт, что эти рабочие процессы скомпилированы и существуют только в свойстве реализации действия ...

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Завернут ли ваш экземпляр рабочего процесса в ActivityBuilder?

Обновление: более детальное изучение. Я нашел одно возможное решение с использованием WorkflowInspectionServices.

var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());
0 голосов
/ 17 ноября 2010

Немного отражений и отражений привели меня к этой пародии:

var impl = (typeof(DemoWorkflow)
            .GetProperty("Implementation", 
                         BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(new DemoWorkflow(), new object[0]) 
            as System.Func<System.Activities.Activity>)();

_workflowDesigner.Load(new ActivityBuilder { Implementation = impl });

Это оно? Шутки в сторону? Мне плохо, зная, что я это написал. Грязный.

Я заметил в отражателе, что xaml для рабочего процесса фактически встроен в сборку в потоке ресурсов: the stream in Reflector

но все попытки использовать это потерпели неудачу.

var target = typeof(DemoWorkflow);
var name = string.Format("{0}.obj.Debug.{1}.g.xaml", 
                         target.Assembly.GetName().Name, 
                         target.Name);
Activity derp = null;
using (var stream = assy.Assembly.GetManifestResourceStream(name))
{
    var reader = new XamlXmlReader(stream, new XamlSchemaContext());
    // throws an exception as the property Implementation is in the xaml;
    // it is protected and cannot be set, so deserialization blows up
    derp = ActivityXamlServices.Load(reader);
}

На данный момент я не вижу других вариантов.

...