Вызов OnBackButtonPressed() в классе ComponentBase в Maui.Net

Я создаю мобильное приложение (Android и iOS), используя .NET MAUI Blazor Hybrid с .NET 8. Для пользовательского интерфейса я использую MudBlazor и реализовал MudDialog в нескольких местах. Моя проблема заключается в том, что при нажатии кнопки «Назад» на мобильном устройстве происходит переход на предыдущую страницу вместо закрытия MudDialog.

Мне известна защищенная функция переопределения bool OnBackButtonPressed(), но ее можно вызвать только в классе, который наследуется от ContentPage. Мои классы наследуются от ComponentBase, поскольку мне нужно использовать функции StateHasChanged() и OnParametersSetAsync().

Как закрыть MudDialog при нажатии кнопки «Назад» на мобильном устройстве без перехода на предыдущую страницу? Есть ли способ вызвать OnBackButtonPressed() в классе ComponentBase? В качестве альтернативы, существует ли метод, использующий JavaScript, для запуска события нажатия кнопки «Назад» и предотвращения перехода на предыдущую страницу, тем самым вместо этого закрывая MudDialog?

Любые рекомендации или предложения будут с благодарностью приняты.

Например, Это моя кнопка для открытия диалога <MudButton Variant = "Variant.Filled" Color = "Color.Primary" OnClick = "CreateNew"> Open Dialog</MudButton> Функция CreateNew такова:

public async Task CreateNew()
    {
        var parameters = new DialogParameters();

        parameters.Add("TempId", TempId);
        var options = new DialogOptions() { CloseOnEscapeKey = true, NoHeader = false, Position = DialogPosition.Center, CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium, DisableBackdropClick = true };

        await DialogService.Show<Dialog>("Create New Support Request", parameters, options).Result;
    }

И мой диалоговый файл таков:

@inject ISnackbar Snack

<MudDialog>
    <TitleContent>
        <MudStack Row AlignItems = "AlignItems.Center">
            <MudText Color = "Color.Info" Typo = "Typo.subtitle2">Start New</MudText>
        </MudStack>
    </TitleContent>
    <DialogContent>
        <MudGrid>
            <MudItem xs = "12" sm = "6">
                <MudTextField FullWidth Margin = "Margin.Dense" Variant=Variant.Outlined Label = "Subject" MaxLength = "100" T = "string" @bind-Value = "title"></MudTextField>
            </MudItem>
        </MudGrid>
        <MudTextField Class = "mb-4" FullWidth Margin = "Margin.Dense" Variant=Variant.Outlined Label = "Message" Lines=5 T = "string" @bind-Value = "msg"></MudTextField>
    </DialogContent>
    <DialogActions>

        <MudButton Disabled = "loading" Color = "Color.Primary" OnClick = "Create">
            Send
            @if (loading == true)
            {
                <MudProgressCircular Size = "Size.Small" Color = "Color.Info" Indeterminate = "true" />
            }
        </MudButton>



    </DialogActions>
</MudDialog>
@code {

    [Parameter]
    public Template TempId { get; set; }
    bool loading = false;
    string title = "", msg = "";
    [CascadingParameter] MudDialogInstance MudDialog { get; set; }


    void close()
    {
        MudDialog.Close();
    }

    public async Task Create()
    {
        //create code
    }
}
```
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как закрыть MudDialog при нажатии кнопки «Назад» на мобильное устройство без перехода на предыдущую страницу?

Вы можете использовать NavigationLock, компонент, представленный в .NET 7, который обеспечивает способ контролировать или предотвращать события навигации в Blazor, что раньше было сложнее эффективно реализовать.

Теперь вы можете предоставить обработчик внутренних событий и включить флаг:canNavigateBack , чтобы контролировать, можете ли вы перейти назад или нет при нажатии кнопки «Назад».

<NavigationLock OnBeforeInternalNavigation = "OnBeforeInternalNavigation" />

private bool canNavigateBack = false;


private async Task OnBeforeInternalNavigation(LocationChangingContext locationChangingContext)
{
       if (!canNavigateBack)
       {
           locationChangingContext.PreventNavigation();
           //you can close MudDialog here
       }
}

Справочная ссылка:

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.comComponents.routing.navigationlock?view=aspnetcore-8.0

Большое спасибо. Это действительно работает отлично.

Mahar Taimur 19.07.2024 19:29

Не беспокойтесь, спасибо за новости. :)

Alexandar May - MSFT 22.07.2024 08:52

Другие вопросы по теме

Похожие вопросы

Как создать интерфейс для условного отношения «один ко многим»?
Код состояния ответа не указывает на успех: BadRequest (400); Подстатус: 0 для базовой вставки CosmosDb
Преобразование поля DateTime в указанный формат в предложенииwhere
Как я могу переписать этот блок if/Else if в более структурированный, сжатый и оптимальный вид. (С#)
Возможная ошибка в выводе предупреждения компилятора C# для проверки допустимости значений NULL
Наследование функций C# и использование возможности повторного использования
Вызов асинхронного метода вызывает отладку
Как выполнить интеграционный тест на конечной точке контроллера API ASP.NET Core, требующей аутентификации и проверки токенов защиты от подделки
Невозможно передать пользовательский атрибут в шаблон Brevo с помощью С#
Как правильно обрабатывать возможные нулевые значения/преобразование нулевых литералов в типы, не допускающие значения NULL, в C#