Перейти к содержанию

Расширения визуализатора

Расширения визуализатора

Визуализатор типового процесса исполнения (задач) позволяет задействовать расширения IWfResolutionVisualizationExtension, изменяющие внешний вид узлов визуализатора, связанный с каждой из отображаемых задач. Такие изменения могут включать как простые изменения (цвет фона и шрифта), так и возможность отобразить произвольный контент в левой и/или правой области узла.

В примере ниже для каждой задачи, автором которой является текущий сотрудник, меняется цвет фона, в левой области выводится иконка “избранное” с датой постановки задачи, а в правой области выводится текст “я автор”.

Напишем класс расширения, получающий сессию сотрудника ISession из Unity, а затем в методе OnNodeGenerated изменим узел context.Node, сгенерированный визуализатором для записи в истории context.HistoryItem.

using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; using Tessa.Extensions.Default.Client.Workflow.Wf; using Tessa.Platform.Runtime; using Tessa.UI.WorkflowViewer;

public sealed class VisualizationExtension : WfResolutionVisualizationExtension { public VisualizationExtension(ISession session) { this.session = session; }

private readonly ISession session;

public override void OnNodeGenerated(IWfResolutionVisualizationContext context) { // если текущий пользователь не является автором визуализируемой задачи, то ничего не меняем if (context.HistoryItem.AuthorID != this.session.User.ID) { return; }

// устанавливаем цвет фона узла context.Node.Background = Brushes.Aquamarine;

// задаём функцию, создающую левую область как картинку с текстом Func<object> createLeftAreaFunc = () => { var imageSource = new BitmapImage(); imageSource.BeginInit(); imageSource.UriSource = new Uri("pack://application:,,,/Tessa.UI;component/Images/favorite.ico"); imageSource.EndInit();

var image = new Image { Width = 16.0, Source = imageSource };

var text = new TextBlock { Text = FormattingHelper.FormatDate(context.HistoryItem.Created), Foreground = Brushes.Gray, HorizontalAlignment = HorizontalAlignment.Center, Margin = new Thickness(0.0, 5.0, 0.0, 0.0), };

var panel = new StackPanel { Orientation = Orientation.Vertical }; panel.Children.Add(image); panel.Children.Add(text);

return panel; };

// устанавливаем левую и правую области, правая область будет просто текстом context.Node.ExtendContent(createLeftAreaFunc, createRightAreaFunc: () => "Я автор");

// если в области нужен только текст или другой объект, не связанный с UI (т.е. ViewModel), // то можно использовать перегрузку метода, просто передав в него текст или объект: //context.Node.ExtendContent("Left\narea"); } }

Класс регистрируется обычным для расширений образом, при этом указываются тип расширения IWfResolutionVisualizationExtension и способ регистрации расширения в Unity.

extensionContainer .RegisterExtension<IWfResolutionVisualizationExtension, VisualizationExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform, 1) .WithUnity(unityContainer .RegisterType<VisualizationExtension>(new ContainerControlledLifetimeManager()))) ;

Аналогичным образом можно написать расширение, которое задаёт произвольный контент в зависимости от любой информации в задании или в карточке, а также на основании произвольной информации, полученной с сервера при загрузке карточки и сохранённой в Info карточки или записи в истории заданий.

Если задаваемый контент представлен в виде объектов WPF, таких как Image и TextBlock, то рекомендуется передавать в метод INode.ExtendContent() функцию, создающую и возвращающую объекты UI. Это позволяет корректно разместить в визуальном дереве такие объекты одновременно для нормального и развёрнутого состояния узла. Для отображения строки текста или модели представления ViewModel, которая связывается с объектами UI через DataTemplate (паттерн MVVM), достаточно передать такие объекты в метод INode.ExtendContent() без использования функций.

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

context.Node.Width = 144.0;

При необходимости получить какую-либо информацию из базы данных в процессе визуализации, эту информацию можно сначала загрузить в расширении CardRequestExtension с типом DefaultRequestTypes.GetResolutionVisualizationData, а затем переместить информацию в текущий контекст карточки, чтобы расширения на визуализатор смогли её получить.

Note

Пример расширения, загружающего информацию из базы данных для визуализации задач, есть в расширении Tessa.Extensions.Default.Server.Workflow.Wf.WfGetResolutionVisualizationDataRequestExtension.

Back to top