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:

Warum r u zusammengebrochen?

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 ...

War es hilfreich?

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: der Strom in Reflector

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top