You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WinForms页面导航问题及全局状态服务配置求助

Blazor WinForms 导航与全局单例服务配置问题

初始问题:Blazor组件导航失效

我有Blazor Web Server和Blazor MAUI Hybrid开发经验,首次尝试在WinForms中集成Blazor组件时,发现HTML链接和NavigationManager都无法实现页面导航。测试代码如下:

默认页面(可正常加载)

@inject NavigationManager NavigationManager
<div>
    <button @onclick="OnClick">Go to page 2</button>
    <a href="#" @onclick="@OnClick" @onclick:preventDefault>go to page 2</a>
    <a href="page2" >go to page 2</a>
</div>
@code {
    private void OnClick()
    {
        NavigationManager.NavigateTo("Page2");
    }
}

第二页面(无法从默认页面打开)

@page "/Page2"
<div>Wellcome to Page2</div>

疑问:是否应该直接在窗体间进行导航?


更新1:全局AppState单例服务配置问题

我尝试通过组件触发窗体状态类事件,实例化新窗体实现导航,但希望通过Program.cs声明全局AppState单例服务统一管理窗体实例化。当前代码中Form1初始化时appState为null,相关代码如下:

Blazor组件与WinForms通信的单例类

public class AppState
{
    public event EventHandler<EventArgs>? GotoForm;
    public void NavigateNext()
    {
        GotoForm?.Invoke(this,new EventArgs());
    }
}

窗体内容组件

@inject AppState appState

<h3>Welcome to Form @FormNumber</h3>

<button @onclick="appState.NavigateNext">Goto page @AltFormNumber()</button>

@code {
    [Parameter] public int FormNumber { get; set; }

    int? AltFormNumber()=>FormNumber == null ? null : 3-FormNumber;
}

默认窗体Form1

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.WebView.WindowsForms;
using Microsoft.Extensions.DependencyInjection;

public partial class Form1 : Form
{
    [Inject] AppState appState { get; }
    public Form1()
    {
        InitializeComponent();
        var services = new ServiceCollection();
        services.AddWindowsFormsBlazorWebView();
        //services.AddSingleton<FormState>();

        blazorWebView1.HostPage = "wwwroot\index.html";
        blazorWebView1.Services = services.BuildServiceProvider();

        //var appState = blazorWebView1.Services.GetRequiredService<AppState>();
        appState.GotoForm += NavigateNext;

        blazorWebView1.RootComponents.Add<Pages.FormComponent>("#app", 
            new Dictionary<string, object?> { { "FormNumber", 1 } });
    }

    private void NavigateNext(object? sender, EventArgs args)
    {
        var frm = new Form2();
        frm.Show();
    }
}

备选窗体Form2

public partial class Form2 : Form
{
    [Inject] AppState appState { get; }
    public Form2()
    {
        InitializeComponent();
        var services = new ServiceCollection();
        services.AddWindowsFormsBlazorWebView();
        //services.AddSingleton<FormState>();

        blazorWebView1.HostPage = "wwwroot\index.html";
        blazorWebView1.Services = services.BuildServiceProvider();

        //var appState = blazorWebView1.Services.GetRequiredService<AppState>();
        appState.GotoForm += NavigateNext;

        blazorWebView1.RootComponents.Add<Pages.FormComponent>("#app",
            new Dictionary<string, object?> { { "FormNumber", 2 } });
    }

    private void NavigateNext(object? sender, EventArgs args)
    {
        var frm = new Form1();
        frm.Show();
    }
}

Program.cs

internal static class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();

        var host = CreateHostBuilder().Build();
        ServiceProvider = host.Services;

        Application.Run(new Form1());
    }
    public static IServiceProvider ServiceProvider { get; private set; }
    static IHostBuilder CreateHostBuilder()
    {
        return Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) => {
                services.AddSingleton<AppState>();
            });
    }
}

请求指导如何正确配置全局AppState单例服务,解决Form1初始化时appState为null的问题。


内容的提问来源于stack exchange,提问作者Matias Masso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:25:25