Domanda

Sto cercando di rehosting il progettista, ma ogni volta che uno schiaffo un flusso di lavoro nel design:

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

dove myWorkflowInstance è un flusso di lavoro definito in un complesso fatto riferimento. Ho fatto il Register magica per ottenere i metadati di attività di default registrati:

new DesignerMetadata().Register();

e ho registrato tutte le mie NativeActivities personalizzati:

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());
}

ancora, quando carico un'attività nella finestra di progettazione questo è ciò che ottengo:

Perché r u crollato?

Che cosa mi manca qui?


Sto pensando che abbia qualcosa a che fare con il fatto che questi flussi di lavoro sono compilati e esistono solo all'interno della proprietà implementazione di un'attività ...

È stato utile?

Soluzione

è l'istanza del flusso di lavoro avvolto in un ActivityBuilder?

Aggiornamento: Indagando un po 'più qui ho trovato una possibile soluzione utilizzando i WorkflowInspectionServices.

var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());

Altri suggerimenti

Un po 'di riflettore e riflessione mi ha portato a questa parodia:

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 });

E 'questo? Sul serio? Mi sento male, sapendo che ho scritto che. Sporca.

ho notato nel riflettore che il codice XAML per il flusso di lavoro in realtà è incorporato nel gruppo in un flusso di risorse: il flusso in Reflector

, ma tutti i tentativi di utilizzare questo fallito.

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);
}

Non vedo alcuna altra opzione a questo punto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top