Повторно размещенный конструктор рабочих процессов импортированные пространства имен по умолчанию

#workflow-foundation #workflow-foundation-4 #rehosting #workflow-rehosting

#рабочий процесс-основа #рабочий процесс-foundation-4 #повторное размещение #рабочий процесс-повторное размещение

Вопрос:

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

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

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

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

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


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

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

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

 _Wd = new WorkflowDesigner();

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

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

Ответ №1:

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

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

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

Комментарии:

1. Да, я закончил делать это до того, как вы опубликовали свое решение. Тем не менее, я поставлю вам галочку «принятый ответ», потому что ваше решение правильное.

Ответ №2:

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

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

 ActivityXamlServices.Load(aStream)  // wrong way!
  

Причина: В

 OnContextChanged() // of class ImportDesigner
  

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

Решение: используйте действие

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