Цель этой публикации:
Я понимаю, что Workflow Foundation не пользуется большой популярностью в StackOverflow и, вероятно, ответов будет немного или вообще не будет. Этот пост предназначен как ресурс для людей, пытающихся настроить внешний вид действий рабочего процесса с помощью пользовательских классов конструктора.
Цели:
Я пытаюсь создать собственный класс конструктора для действий рабочего процесса, чтобы добиться следующего:
Сделайте действия менее техническими. Например, мне не обязательно видеть имя внутреннего объекта в качестве "заголовка" действия - вместо этого я хотел бы видеть что-то более информативное.
Отображать значения определенных свойств под текстом заголовка. Я хотел бы видеть значения некоторых свойств непосредственно под заголовком, чтобы мне не приходилось искать где-то еще (а именно, в окне свойств) .
Предоставьте настраиваемые области перетаскивания и нарисуйте собственные внутренние стрелки. В качестве примера я хотел бы иметь возможность иметь настраиваемые области перетаскивания в очень определенных местах.
Что я выяснил на данный момент:
Я создал специальный класс конструктора, производный от SequentialActivityDesigner
, следующим образом:
[Designer(typeof(SomeDesigner))]
public partial class SomeActivity: CompositeActivity
{
...
}
class PlainDesigner : SequentialActivityDesigner
{
...
}
Переопределив некоторые свойства и метод OnPaint
, я узнал о следующих соответствиях между свойствами и тем, как будет отображаться активность:
Рисунок 1. Связь между некоторыми свойствами SequentialActivityDesigner
и отображаемым действием.
Возможные решения для цели №1 (сделать действия менее техническими) и цели №2 (отображать значения свойств под текстом заголовка):
Отображаемый заголовок можно изменить с помощью свойства
Title
.Если для отображения дополнительной информации под заголовком требуется больше места, свойство
TitleHeight
можно увеличить (т. Е. Переопределить свойство и заставить его возвращатьbase.TitleHeight + n
, гдеn
- некоторое положительное целое число).Переопределите метод
OnPaint
и нарисуйте дополнительный текст в области, зарезервированной черезTitleHeight
.
Открытые вопросы:
Для чего используются разъемы, соединения и точки подключения? Они кажутся необходимыми, но для чего?
Хотя цели перетаскивания могут быть достигнуты с помощью метода
GetDropTargets
, кажется, что это не обязательно то место, где дизайнер будет размещать отброшенные действия. Когда действие перетаскивается по рабочему процессу, конструктор отображает маленькие зеленые знаки плюса, где действия можно отбросить; как он определяет расположение этих знаков плюса?Как дизайнер определяет, где провести соединительные линии и стрелки?