Действия всегда разрушаются в Rehosted Designer
-
10-10-2019 - |
Вопрос
Я пытаюсь решить дизайнера, но каждый раз, когда я шлепаю рабочий процесс в дизайнера:
_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());
}
Тем не менее, когда я загружаю деятельность в дизайнере, это то, что я получаю:
Что мне здесь не хватает?
Я думаю, что это как -то связано с тем фактом, что эти рабочие процессы составлены и существуют только в рамках свойства реализации деятельности ...
Решение
Ваш экземпляр рабочего процесса обернут в строитель Activity?
Обновление: здесь немного дальше, я нашел одно возможное решение с использованием рабочих процессов.
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);
}
На этом этапе я не вижу другого варианта.