使用Blazor开发WinForm程序

本文介绍了如何使用Blazor,微软的前端框架,与WinForm结合,创建C#桌面应用程序。通过修改项目SDK,添加必要的NuGet包,设置Host页面和组件,以及在WinForm中集成BlazorWebView,实现用C#进行前端UI开发。详细步骤包括创建WinForm项目,配置项目文件,编写 Razor 页面,并展示了最终运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关于Blazor

Blazor是微软出品的前端框架,对标谷歌的Flutter,用C#、css、html语言开发前端UI,组件化设计,支持嵌套组件与大多数前端框架react、vue等类似,不同的是开发语言不是JavaScript,但是它可以与JavaScript互操作。Host模式支持Blazor Server、Blazor WebAssembly和Blazor Hybrid(MAUI、WPF、WinForm),可用它来开发Web、移动App、桌面应用。

2.创建WinForm步骤

  1. 打开VS2022,创建新项目,选择Windows窗体应用,将工程文件sdk改成 Microsoft.NET.Sdk.Razor

  2. 添加 NuGet 包 Web 和 WebView.WindowsForms,创建后的工程文件如下:

   <Project Sdk="Microsoft.NET.Sdk.Razor">
     <PropertyGroup>
       <OutputType>WinExe</OutputType>
       <TargetFramework>net6.0-windows</TargetFramework>
       <Nullable>enable</Nullable>
       <UseWindowsForms>true</UseWindowsForms>
       <ImplicitUsings>enable</ImplicitUsings>
     </PropertyGroup>
     <ItemGroup>
       <PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="6.0.3" />
       <PackageReference Include="Microsoft.AspNetCore.Components.WebView.WindowsForms" Version="6.0.101-preview.11.2349" />
     </ItemGroup>
   </Project>
  1. 添加 wwwroot 文件夹,添加 index.html 和 css/app.css
   <!DOCTYPE html>
   <html lang="en">
   <head>
       <meta charset="utf-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
       <title>WinApp</title>
       <base href="/" />
       <link href="css/font-awesome.css" rel="stylesheet" />
       <link href="css/app.css" rel="stylesheet" />
       <link href="WinApp.styles.css" rel="stylesheet" />
   </head>
   <body>
       <div id="app">Loading...</div>
       <div id="blazor-error-ui">
           An unhandled error has occurred.
           <a href="" class="reload">Reload</a>
           <a class="dismiss">🗙</a>
       </div>
       <script src="_framework/blazor.webview.js"></script>
   </body>
   </html>
  1. 添加_Imports.razor
   @using Microsoft.AspNetCore.Components.Web
  1. 添加App.razor,其中DynamicComponent是动态组件,动态显示Home和Setting等razor页面
   <div class="app">
       <div class="sider">
           <h1 class="fa fa-university logo" @onclick="e => OnClickMenu(Menus[0])"></h1>
           <ul class="menu menu1">
               @foreach (var menu in Menus)
               {
                   <li class="@menu.Icon @Active(menu)" @onclick="e => OnClickMenu(menu)"></li>
               }
           </ul>
           <ul class="menu menu2">
               <li class="@setting.Icon @Active(setting)" @onclick="e => OnClickMenu(setting)"></li>
           </ul>
       </div>
       <div class="content">
           @if (isHome)
           {
               <div class="title welcome">欢迎使用XX管理系统</div>
           }
           else
           {
               <div class="title">@title</div>
           }
           <DynamicComponent Type="@componentType" />
       </div>
   </div>
   
   @code {
       private string? code = "Home";
       private string? title = "";
       private bool isHome = true;
       private Type? componentType;
   
       private MenuItem setting = new MenuItem("Setting", "系统设置", "fa fa-bars", typeof(Setting));
       private MenuItem[] Menus = new MenuItem[]
       {
           new MenuItem("Home", "首页", "fa fa-home", typeof(Home))
       };
   
       protected override void OnInitialized()
       {
           base.OnInitialized();
           componentType = Menus[0].Type;
       }
   
       private void OnClickMenu(MenuItem menu)
       {
           isHome = menu.Id == "Home";
           code = menu.Id;
           title = menu.Name;
           componentType = menu.Type;
       }
   
       private string Active(MenuItem menu) => code == menu.Id ? "active" : "";
   
       private record MenuItem(string Id, string Name, string Icon, Type Type);
   }
  1. 在工具箱中拖动BlazorWebView控件到窗体Form1中

  2. 在Form1.cs构造函数中添加如下代码:

   public Form1()
   {
       InitializeComponent();
   
       var services = new ServiceCollection();
       services.AddBlazorWebView();
       blazorWebView.HostPage = "wwwroot\\index.html";
       blazorWebView.Services = services.BuildServiceProvider();
       blazorWebView.RootComponents.Add<App>("#app");
   }
  1. 添加Pages文件夹,添加 Pages/Home.razor文件
   <h1>Home</h1>
   <p role="status">Current count: @currentCount</p>
   <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
   
   @code {
       private int currentCount = 0;
   
       private void IncrementCount()
       {
           currentCount++;
       }
   }

3.运行效果

image

### 使用Ant Design风格的UI库在Winform项目中的方法 对于希望在其Windows Forms (Winform) 应用程序中采用Ant Design样式的开发者来说,直接利用官方的Ant Design Web资源是不可能的,因为这些资源主要面向Web开发环境。然而,有几种替代方案可以实现这一目标。 一种解决方案是使用第三方控件库,例如DevExpress或Telerik,它们提供了一些类似于Ant Design的设计组件[^3]。不过这类商业产品可能并不完全遵循Ant Design指南,并且需要购买许可证才能用于生产环境中。 另一种更贴近原生Ant Design体验的方式是通过.NET生态系统的开源项目来达成目的。目前有一个名为`ant-design-blazor` 的Blazor框架扩展实现了Ant Design设计语言的支持[^4]。虽然这不是专门为Winforms创建的产品,但是可以通过WebView2控件将基于HTML/JavaScript的应用嵌入到桌面应用程序内显示出来。这意味着可以在后台继续使用C#编写逻辑代码,在前端则借助于支持Ant Design样式表单和布局结构的技术栈构建界面部分。 为了具体展示如何操作,请参见下面给出的一个简单例子: #### 创建一个新的WinForms App(.NET Core) 启动Visual Studio并新建一个`.NET Core Windows Forms App` #### 添加必要的NuGet包 安装Microsoft.Web.WebView2 SDK以便能够加载外部网页内容作为视图的一部分: ```shell dotnet add package Microsoft.Web.WebView2 ``` #### 修改MainForm.cs文件以集成WebView2 编辑默认生成的窗体类(MainForm),引入WebView2实例并将之设置为主要内容区域。 ```csharp using System; using System.Windows.Forms; namespace AntDesignInWinformsExample { public partial class MainForm : Form { private readonly WebView2 webView; public MainForm() { InitializeComponent(); // 初始化WebView2对象 webView = new WebView2 { Dock = DockStyle.Fill }; Controls.Add(webView); InitializeAsync().ConfigureAwait(false); } async void InitializeAsync(){ await webView.EnsureCoreWebView2Async(null); string urlPath = "ms-appx-web:///wwwroot/index.html"; webView.CoreWebView2.Navigate(urlPath); } } } ``` #### 构建Blazor应用并与WinForms连接 按照官方文档指导建立独立的Blazor Server 或者 Blazor WASM工程,确保其依赖项包含了`AntDesign` Nuget Package, 并完成相应页面和服务端API接口定义工作之后,将其编译成果复制至上述路径下供WebView访问即可[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值