Le attività sono sempre crollato in designer rehosted
-
10-10-2019 - |
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:
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à ...
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:
, 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.