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

Создание диалоговых окон

Создание диалоговых окон

Простое диалоговое окно

Для создания простого диалогового окна нужно воспользоваться стандартным классом TessaDialog.

Класс имеет следующие стандартные возможности отображения:

  • Confirm - Отображает пользователю вопрос в виде окна с сообщением и кнопками “Да” и “Нет”.

  • ConfirmWithCancel - Отображает пользователю вопрос в виде окна с сообщением и кнопками “Да”, “Нет” и “Отмена”.

  • ShowError - Отображает пользователю окно с сообщением об ошибке.

  • ShowException - Отображает исключение в окне сообщений.

  • ShowMessage - Отображает пользователю окно с сообщением.

  • ShowNotEmpty - Отображает результат валидации в окне сообщений.

Рассмотрим пример создания модального диалогового окна ConfirmWithCancel с получением и обработкой результата:

using Tessa.UI;

...

SomeMethod() { bool? dialogResult = TessaDialog.ConfirmWithCancel( "Отображаемое пользователю сообщение", "Заголовок отображаемого диалогового окна");

if (!dialogResult.HasValue) { //Пользователь выбрал "Отмена" //Отменяем действие }

else if (dialogResult.Value) { //Пользователь выбрал "Да" //Производим все необходимые действия }

else { //Пользователь выбрал "Нет" //Производим все необходимые действия } }

...

Диалоговое окно на основе вкладки карточки (устаревший способ)

Кроме простых диалоговых окон можно создавать диалоговые окна на основе интерфейса вкладки карточки. Для этого можно создать в системе специальную карточку, привязанную к виртуальным секциям, создать в ней вкладку и использовать эту вкладку как интерфейс диалогового окна. В платформе для таких целей используется карточка “Dialogs”.

Рассмотрим пример создания такого диалогового окна:

using Tessa.UI;

...

SomeMethod() { // Получаем вкладку CardType dialogType; CardTypeNamedForm dialogForm; if (!cardMetadata.CardTypes.TryGetValue("CardName", out dialogType) || (dialogForm = dialogType.Forms.FirstOrDefault(x => x.Name == "TabAlias")) == null) { return; }

CardNewRequest request = new CardNewRequest { CardTypeID = dialogType.ID }; CardNewResponse response = cardRepository.New(request); if (!CheckResponseAndSetID(response)) { return; }

// Создаём модель окна ICardModel windowCardModel = createCardModelFunc( response.Card, response.SectionRows, x => dialogManager.ShowRow(x));

// Секция с данными, которая будет использоваться внутри окна, и которую нужно потом получить снаружи. var section = windowCardModel.Card.Sections["SomeSection"];

// Показываем диалог uiHost.ShowFormDialog( LocalizationManager.Localize(dialogForm.TabCaption), dialogForm, windowCardModel, form => { }, new UIButton( "$UI_Common_OK", () => { // Обработка результатов при нажатии кнопки "OK" ... return true; }, isDefault: true, isEnabledFunc: () => true), new UIButton("$UI_Common_Cancel", isCancel: true)); }

Note

Более подробный пример можно посмотреть в расширениях Tessa.Extensions.Default.Client.Tiles.AcquaintanceTileExtension.

Диалоговое окно на основе вкладки типа диалога

Кроме простых диалоговых окон можно создавать диалоговые окна на основе интерфейса вкладки типа диалога. Данный способ предпочтительнее, чем создание диалогового окна на основе интерфейса вкладки карточки:

  • При создании формы типа диалога не выполняется запроса к серверу.

  • Нет необходимости вносить изменения в схему, что упрощает обновления конфигурации - достаточно импортировать один тип диалога.

  • Для разных типов диалога можно использовать виртуальные секции и колонки с одинаковыми именами.

Рассмотрим пример создания такого диалогового окна:

using Tessa.UI; using Tessa.UI.Cards;

...

private readonly IUIHost uiHost; private readonly CreateDialogFormFuncAsync createDialogFormFuncAsync;

...

private async ValueTask SomeMethodAsync(CancellationToken cancellationToken = default) { var (dialogForm, cardModel) = await this.createDialogFormFuncAsync( "Название типа диалога", // Если требуется отобразить первую или единственнну вкладку, то Алиас вкладки можно не указывать. "Алиас вкладки", modifyResponseAsync: (response, ct) => { // Модификация CardNewResponse до создания модели карточки. // (аналог CardGetExtension.AfterRequest) ...

return new ValueTask(); }, modifyModelAsync: (model, ct) => { // Модификация модели карточки до ее инициализации. // (аналог CardUIExtension.Initializing) ...

return new ValueTask(); }, cancellationToken: cancellationToken );

if (dialogForm is null) { TessaDialog.ShowError("Тип диалога \"Название типа диалога\" не найден."); return; }

// Действия изменяющие UI формы (аналог CardUIExtension.Initialized) ...

// Показываем диалог await this.uiHost.ShowDialogAsync( "Заголвок диалога", dialogForm, initializeWindowActionAsync: (window, ct) => { // Модификация окна, в котором будет открыт диалог. // Например, обработка нажатий клавиш на клавиатуре. ...

return new ValueTask(); }, modalDialog: true, closeOnEscapeKey: false, cancellationToken: cancellationToken, new UIButton( "$UI_Common_OK", button => { // Обработка результатов при нажатии кнопки "OK" ...

return new ValueTask(); }, isDefault: true), new UIButton("$UI_Common_Cancel", isCancel: true) ); }

Tip

Пример отображения формы типа диалога можно найти в карточке “Автомобиль” (кнопка “Показать диалог”).

Back to top