Maui сhange 在 BlazorWebView 中的导航

Maui сhange navigation in BlazorWebView

如何使用 Maui 更改 BlazorWebView 中的页面?例如'/'页面被打开,我需要打开'/fetch'

我找到了如何通过 js return 到以前的 link。

创建了自定义导航管理器:

    public class CustomNavigationManager
    {
        private static IJSRuntime JSRuntime { get; set; }
        public CustomNavigationManager(IJSRuntime jSRuntime)
        {
            JSRuntime = jSRuntime;
        }

        public static async Task Navigation(string url)
        {
            //Microsoft.Maui.Platform;
            if (JSRuntime!= null)
            {
                await JSRuntime.InvokeVoidAsync("navigation", url);
            }
        }
    }

其中调用了Js代码。其中调用了Js代码。我放在 wwwroot/index.html

<script type="text/javascript">
        window.navigation = (url) => {
            window.location.href = url; // Error: There is no content at fetch.
            //history.back();
            //window.location="https://0.0.0.0/fetch"; //Error: There is no content at fetch.
        }
</script>


正在注册服务

builder.Services.AddTransient<CustomNavigationManager>();

并注入 Shared/MainLayout.razor

@page "/"
@inject CustomNavigationManager navigation

我在毛伊岛使用它

await CustomNavigationManager.Navigation("/fetch");

如果我使用 js 代码 history.back(); 那么一切正常,

但是如果我想重定向到 /fetch 使用

window.location.href = url;

然后我得到一个错误:提取时没有内容。

Fetch.razor 页

@page "/fetch"
@page "/fetch/{id}"

<h1>Test!</h1>

Fetch.razor

@page "/fetch"
@page "/fetch/{text}"

<h3>@Text</h3>

@code
{
    [Parameter]
    public string Text { get; set; }
}

MainLayout.razor

@inherits LayoutComponentBase

@inject CustomNavigationManager navigation

<div class="page">
    <div class="sidebar">
        <NavMenu />
    </div>

    <main>
        <div class="top-row px-4">
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>

        <article class="content px-4">
            @Body
        </article>

        <div>@Url</div>
    </main>
</div>

@code
{
    [Inject]
    private NavigationManager MyNavigationManager { get; set; }

    private string Url;

    protected override void OnInitialized()
    {
        base.OnInitialized();
        MyNavigationManager.LocationChanged += OnLocationChanges;
        Url = MyNavigationManager.Uri;
    }

    private void OnLocationChanges(object sender, LocationChangedEventArgs e)
    {
        Url = e.Location;
        StateHasChanged();
    }
}

CustomNavigationManager.cs

public class CustomNavigationManager
    {
        private static NavigationManager _navigationManager;
        public CustomNavigationManager(NavigationManager MyNavigationManager)
        {
            _navigationManager = MyNavigationManager;
        }

        public static void Navigation(string url)
        {
            if (_navigationManager!=null)
            {
                _navigationManager.NavigateTo(url);
            }
        }
    }

如此决定:订阅了导航更改事件。实施服务,并调用 NavigateTo。它没有通过 Js 工作。注意:BlazorWebView 必须已经下载了项目,否则什么也做不了)