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

IMessageBoxService

IMessageBoxService предоставляет платформенно-независимый способ показывать стандартные окна сообщений из ViewModel. ViewModel при этом остаются полностью отделёнными от типов окон Avalonia.

app-services-imessageboxservice

Основные возможности:

  • Фиксированные наборы кнопок — Окна сообщений могут отображать фиксированные наборы кнопок, определённые перечислением MessageBoxButtons (например, Ok, Ok|Cancel, Yes|No|Cancel, Yes|No, Abort|Retry|Ignore и Retry|Cancel)
  • Автоматическое определение владельца — Сервис может автоматически определять окно-владельца через сервис IWindowsManager. При необходимости владельца окна сообщения можно также задать явно.
  • Получение результата окна сообщения — После закрытия окно сообщения возвращает результат, заданный перечислением DialogResult.

Определение интерфейса

public interface IMessageBoxService
{
    // Show a message box with an explicit owner.
    DialogResult Show(IWindow? owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon);

    // Show a message box with the default owner (the active window detected through the `IWindowsManager` service).
    DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon);
}

Использование IMessageBoxService

Чтобы отобразить окно сообщения, вызовите в ViewModel метод IMessageBoxService.Show объекта сервиса. Метод возвращает результат окна сообщения (кнопку, которую нажал пользователь).

Метод IMessageBoxService.Show без параметра owner назначает владельцем окна сообщения активное окно. Активное окно определяется через сервис IWindowsManager.

Доступ к сервису

Получить объект IMessageBoxService в ViewModel можно двумя способами:

  • С помощью вспомогательного метода Service<T>(). Это удобный способ получить зарегистрированные сервисы приложения, входящие в библиотеку Eremex Controls.
  • Через внедрение в конструктор.

Вспомогательный метод Service()

Реализуйте в ViewModel вспомогательный метод Service<T>(), который возвращает запрошенный сервис с помощью статического метода ApplicationServicesContext.GetRequiredService<T>().

using Eremex.AvaloniaUI.Controls.ApplicationServices;
using CommunityToolkit.Mvvm.Input;

public partial class MyViewModel : ObservableObject
{

    // Provides access to any registered service
    protected static T Service<T>() where T : class
        => ApplicationServicesContext.GetRequiredService<T>();

    [RelayCommand]
    private void ShowInformation()
    {
        // Resolve the service directly from the Service<T>() method
        var result = Service<IMessageBoxService>()
            .Show("Save changes?", "Question",
                  MessageBoxButtons.Ok, MessageBoxIcon.Question);
    }
}

Убедитесь, что в файле App.axaml.cs сервисы приложения Eremex зарегистрированы с помощью SimpleServiceProvider и ApplicationServicesContext следующим образом:

public class App : Application
{
    public override void OnFrameworkInitializationCompleted()
    {
        RegisterApplicationServices();
        //...
    }

    static void RegisterApplicationServices()
    {
        // Register built-in services.
        var serviceProvider = new SimpleServiceProvider();
        ApplicationServicesContext.RegisterApplicationServices(serviceProvider.AddSingleton);
        ApplicationServicesContext.SetCurrent(serviceProvider);
    }

}

Внедрение в конструктор

Реализуйте в ViewModel конструктор с параметром типа IMessageBoxService. При создании ViewModel передайте объект сервиса в этот конструктор.

public partial class MyViewModel
{
    private readonly IMessageBoxService _messageBoxService;
    public MyViewModel(IMessageBoxService messageBoxService)
    {
        _messageBoxService = messageBoxService;
    }
    [RelayCommand]
    private void ShowMessage()
    {
        var result = _messageBoxService.Show(
            "Save changes?", "Question", MessageBoxButtons.Ok, MessageBoxIcon.Question
        );
        //...
    }
}

Для окон сообщений с собственными подписями кнопок используйте IChoiceDialogService. Для полностью настраиваемых диалогов используйте IDialogService.



* Эта страница переведена с использованием технологий машинного перевода.