Rehosted Workflow Designer по умолчанию импортирует пространства имен - PullRequest
3 голосов
/ 23 мая 2011

Я пытаюсь переназначить конструктор рабочих процессов WF4. На вкладке «Импорт» я хотел бы импортировать некоторые пространства имен по умолчанию. Это выглядит так:

Импортированные пространства имен http://imageshack.us/m/850/5383/imports.png

После долгих исследований я понял, что если вы посмотрите на

workflowDesigner.Context.Items.GetValue<ImportedNamespaceContextItem>().ImportedNamespaces

вы увидите вещи, которые уже импортированы. Однако добавление пространства имен вручную в эту коллекцию, похоже, не имеет никакого эффекта. Поэтому мой вопрос: как правильно добавить импортированные пространства имен в этот список? Или как получить контекст для обновления, используя мой добавленный вручную импорт пространства имен?


Дополнительная информация к решению ниже :

Чтобы решить эту проблему, я создал желаемый XAML-файл активности «чистого листа», добавил его в свой проект, установил для Действие сборки значение Встроенный ресурс и * 1020. * Пользовательский инструмент для пустой строки.

Затем в коде, который инициализирует мой WorkflowDesigner, я делаю следующее:

_Wd = new WorkflowDesigner();

_Wd.Load(
    XamlServices.Load(
        ActivityXamlServices.CreateBuilderReader(
            new XamlXmlReader(
                Assembly.GetEntryAssembly().GetManifestResourceStream( "WpfApplication1.New.xaml" )
            )
        )
    ) as ActivityBuilder
);

Теперь в моем рабочем процессе импортированы все желаемые пространства имен.

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Я делаю это, не начиная с полностью пустого рабочего процесса, а создавая пустой шаблон с требуемым импортом. Добавить что-то вроде:

 xmlns:si="clr-namespace:System.IO;assembly=mscorlib" 

к корневому действию в файле XAML для импорта System.IO

0 голосов
/ 23 января 2017

Ваше решение также решает другую проблему с переназначением потоковых действий, и я не могу найти никакого предлагаемого решения, поэтому я публикую это здесь.

Симптом заключается в том, что вы получаете модальное диалоговое окно на хосте конструктора, в котором указывается исключение пустой ссылки в System.Activities.Presentation.View.ImportDesigner.OnContextChanged (), если вы загрузилидействие с

ActivityXamlServices.Load(aStream)  // wrong way!

Причина: В

OnContextChanged() // of class ImportDesigner

в https://referencesource.microsoft.com/#System.Activities.Presentation/System.Activities.Presentation/System/Activities/Presentation/View/ImportDesigner.xaml.cs,1d24713ba95e69c5 доступ к .Collection свойства «Импорт» поднимает нольисключение указателя.Возможно, потому что не было загружено никакой информации об импортированных пространствах имен.

Решение: Используйте Activity

ab.Implementation // of the ActivityBuilder ab 

из сообщения Алекса и .Load () в экземпляр WorkflowDesigner.

Полный фрагмент кода:

public static Activity LoadActivityFrom(FileInfo xaml)
{
  using (var rd = xaml.OpenRead())
  using (var xr = new System.Xaml.XamlXmlReader(rd))
  using (var br = System.Activities.XamlIntegration.ActivityXamlServices.CreateBuilderReader(xr))
  {
    var ab = System.Xaml.XamlServices.Load(br) as System.Activities.ActivityBuilder;
    return ab.Implementation;
  }
}
...