1

デザイナーを再ホストしようとしていますが、デザイナーにワークフローを平手打ちするたびに:

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

ここmyWorkflowInstanceで、参照アセンブリで定義されたワークフローです。Registerデフォルトのアクティビティ メタデータを登録するための魔法を実行しました。

new DesignerMetadata().Register();

そして、すべてのカスタム NativeActivities を登録しました。

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

それでも、デザイナーでアクティビティをロードすると、次のようになります。

なんで崩壊したの?

ここで何が欠けていますか?


これらのワークフローがコンパイルされ、アクティビティの実装プロパティ内にのみ存在するという事実と関係があると思います...

4

2 に答える 2

1

ワークフロー インスタンスは ActivityBuilder にラップされていますか?

更新: ここでもう少し調査したところ、WorkflowInspectionServices を使用して 1 つの可能な解決策が見つかりました。

var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());
于 2010-11-16T07:51:10.580 に答える
0

ちょっとしたリフレクターとリフレクションが、私をこの茶番劇に導きました。

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

これでしょうか?真剣に?それを書いたことを知って気分が悪くなります。汚れた。

リフレクターで、ワークフローの xaml が実際にはリソース ストリームのアセンブリに埋め込まれていることに気付きました。 Reflector のストリーム

しかし、これを使用する試みはすべて失敗しました。

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

現時点では、他に選択肢はありません。

于 2010-11-16T21:00:37.197 に答える