Les activités sont toujours effondrés dans le concepteur réhébergé
-
10-10-2019 - |
Question
Je suis en train de réhéberger le concepteur, mais chaque fois que je tape un flux de travail dans le concepteur:
_workflowDesigner = new WorkflowDesigner();
// added to UI here
Properties.Content = _workflowDesigner.PropertyInspectorView;
_workflowDesigner.Load(myWorkflowInstance);
où myWorkflowInstance
est un flux de travail défini dans un ensemble référencé. Je l'ai fait le Register
magique pour obtenir les métadonnées d'activité par défaut enregistré:
new DesignerMetadata().Register();
et je me suis inscrit tous mes NativeActivities personnalisés:
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());
}
encore, quand je charge une activité dans le concepteur ce que je reçois:
Qu'est-ce que je manque ici?
Je pense qu'il a quelque chose à voir avec le fait que ces flux de travail sont compilés et existent uniquement dans la propriété de mise en œuvre d'une activité ...
La solution
Votre instance de workflow enveloppé dans un ActivityBuilder?
Mise à jour: Enquête un peu plus je trouve ici une solution possible en utilisant les WorkflowInspectionServices.
var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());
Autres conseils
Un peu de réflecteur et de réflexion m'a conduit à cette parodie:
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 });
Est-ce cela? Sérieusement? Je me sens malade sachant que je l'ai écrit cela. Sale.
J'ai remarqué dans le réflecteur que le XAML pour le flux de travail est en fait intégré dans l'ensemble dans un flux de ressources:
mais toutes les tentatives d'utiliser ce échoué.
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);
}
Je ne vois pas d'autre option à ce stade.