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