Die Aktivitäten sind kollabiert immer in rehosted Designer
-
10-10-2019 - |
Frage
Ich versuche, die Designer rehosten, aber jedes Mal, wenn ich schlagen einen Workflow in den Designer:
_workflowDesigner = new WorkflowDesigner();
// added to UI here
Properties.Content = _workflowDesigner.PropertyInspectorView;
_workflowDesigner.Load(myWorkflowInstance);
wo myWorkflowInstance
ist ein Workflow in einer Assembly verwiesen definiert. Ich habe die Magie Register
getan, um den Standard-Aktivität Metadaten erhalten registriert:
new DesignerMetadata().Register();
, und ich habe alle meine benutzerdefinierten NativeActivities registriert:
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());
}
doch, wenn ich eine Tätigkeit im Designer laden das ist, was ich bekommen:
Was ich hier fehlt?
Ich denke, es hat etwas mit der Tatsache zu tun, dass dieser Workflows erstellt werden und existiert nur in der Umsetzung Eigenschaft einer Aktivität ...
Lösung
Ist Ihre Workflow-Instanz in einer Activity gewickelt?
Update: Untersuchung ein wenig weiter hier fand ich eine mögliche Lösung der WorkflowInspectionServices verwendet wird.
var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());
Andere Tipps
Ein bisschen Reflektor und Reflexion hat mich dazu gebracht, auf diese Travestie:
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 });
Ist es das? Ernsthaft? Ich fühle mich krank zu wissen, dass ich das geschrieben habe. Schmutzige.
bemerkte ich in Reflektor, dass der XAML für den Workflow tatsächlich in der Baugruppe in einem Ressourcenstrom eingebettet ist:
aber alle Versuche, diese scheiterte zu verwenden.
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);
}
Ich sehe keine andere Möglichkeit, an dieser Stelle.