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
相关产品推荐
相关产品推荐

