リホストされたデザイナーでは、アクティビティは常に崩壊します
-
10-10-2019 - |
質問
私はデザイナーを再設置しようとしていますが、ワークフローをデザイナーに平手打ちするたびに:
_workflowDesigner = new WorkflowDesigner();
// added to UI here
Properties.Content = _workflowDesigner.PropertyInspectorView;
_workflowDesigner.Load(myWorkflowInstance);
どこ myWorkflowInstance
参照されたアセンブリで定義されているワークフローです。私は魔法をしました Register
デフォルトのアクティビティメタデータを登録するには:
new DesignerMetadata().Register();
そして、私は私のすべてのカスタムネイティブアクティビティを登録しました:
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());
}
しかし、デザイナーにアクティビティをロードするとき、これは私が得るものです:
ここに何が欠けていますか?
これらのワークフローが編集されており、アクティビティの実装プロパティ内にのみ存在するという事実と関係があると思います...
解決
ワークフローインスタンスはActivityBuilderに包まれていますか?
更新:ここでもう少し調査すると、ワークフローインセクションサービスを使用して1つの可能なソリューションが見つかりました。
var activities = WorkflowInspectionServices.GetActivities(new DemoWorkflow());
designer.Load(activities.First());
他のヒント
少しの反射と反射が私をこの悲劇に導いた:
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が実際にリソースストリームのアセンブリに埋め込まれていることに気付きました。
しかし、これを使用しようとするすべての試みは失敗しました。
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);
}
この時点で他の選択肢はありません。
所属していません StackOverflow