首页 > 编程语言 >在 WPF 中集成 ASP.NET Core 和 WebView2 用于集成 SPA 应用

在 WPF 中集成 ASP.NET Core 和 WebView2 用于集成 SPA 应用

时间:2024-05-11 17:08:08浏览次数:26  
标签:集成 Core ASP MainWindow using WebApplication NET

背景

我们有些工具在 Web 版中已经有了很好的实践,而在 WPF 中重新开发也是一种费时费力的操作,那么直接集成则是最省事省力的方法了。

修改项目文件

我们首先修改项目文件,让 WPF 项目可以包含 ASP.NET Core 的库,以及引用 WebView2 控件。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
	<OutputType>WinExe</OutputType>
	<TargetFramework>net8.0-windows</TargetFramework>
	<Nullable>enable</Nullable>
	<ImplicitUsings>enable</ImplicitUsings>
	<UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <!-- 这里插入 WebView2 的包,用于显示网页 -->
	<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2478.35" />
    <!-- 这里插入 ASP.NET Core 的框架引用,用于代理资源文件 -->
	<FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <!-- 这里模仿 ASP.NET Core,将 SPA 资源文件存于 wwwroot 文件夹下 -->
	<None Update="wwwroot\**">
	  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
	</None>
  </ItemGroup>

</Project>

修改 App.xamlApp.xaml.cs 以使用 ASP.NET Core 的 WebApplication.CreateBuilder()

这里为了全局使用依赖注入,我们将 WebApplication.CreateBuilder() 放在 App.xaml.cs 中全局使用。为了使用依赖注入应注释掉默认启动窗口,并接管 Startup 事件。

<Application x:Class="WpfAircraftViewer.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfAircraftViewer"
             Startup="ApplicationStartup">
    <!-- 这里将 StartupUri 属性删除,然后注册 Startup 事件 -->
    <Application.Resources>
         
    </Application.Resources>
</Application>

然后通过修改 Startup 事件的代码来实现相应的加载动作。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.DependencyInjection;
using System.Windows;

namespace WpfAircraftViewer
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application, IAsyncDisposable
    {
        public WebApplication? WebApplication { get; private set; }

        public async ValueTask DisposeAsync()
        {
            if (WebApplication is not null)
            {
                await WebApplication.DisposeAsync();
            }
            GC.SuppressFinalize(this);
        }
        
        private async void ApplicationStartup(object sender, StartupEventArgs e)
        {
            // 这里是创建 ASP.NET 版通用主机的代码
            var builder = WebApplication.CreateBuilder(Environment.GetCommandLineArgs());
            // 注册主窗口和其他服务
            builder.Services.AddSingleton<MainWindow>();
            builder.Services.AddSingleton(this);
            var app = builder.Build();
            // 这里是文件类型映射,如果你的静态文件在浏览器中加载报 404,那么需要在这里注册,这里我加载一个 3D 场景文件的类型
            var contentTypeProvider = new FileExtensionContentTypeProvider();
            contentTypeProvider.Mappings[".glb"] = "model/gltf-binary";
            app.UseStaticFiles(new StaticFileOptions
            {
                ContentTypeProvider = contentTypeProvider,
            });
            // 你如果使用了 Vue Router 或者其他前端路由了,需要在这里添加这句话让路由返回前端,而不是 ASP.NET Core 处理
            app.MapFallbackToFile("/index.html");
            WebApplication = app;
            // 处理退出事件,退出 App 时关闭 ASP.NET Core
            Exit += async (s, e) => await WebApplication.StopAsync();
            // 显示主窗口
            MainWindow = app.Services.GetRequiredService<MainWindow>();
            MainWindow.Show();
            await app.RunAsync().ConfigureAwait(false);
        }
    }
}

此时,我们已经可以正常开启一个默认界面的 MainWindow 了。

使用 WebView2 控件

这时我们就可以先将 SPA 文件从 npm 项目的 dist 复制到 wwwroot 了,在编辑 MainWindow 加入 WebView2 控件后就可以查看了。

<Window x:Class="WpfAircraftViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAircraftViewer"
        xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
        mc:Ignorable="d" MinHeight="450" MinWidth="800" SnapsToDevicePixels="True">
        <!-- 在上面加入 xmlns:wv2 属性用于引用 WebView2 控件 -->
    <Grid>
        <!-- 这里插入 WebView2 控件,我们默认可以让 Source 是 http://localhost:5000,这是 ASP.NET Core 的默认监听地址 -->
        <wv2:WebView2 Name="webView"
                  Source="{Binding SourceUrl, FallbackValue='http://localhost:5000'}" AllowDrop="True" SnapsToDevicePixels="True"/>
    </Grid>
</Window>

我们可以继续编辑窗口的信息,让他可以关联 ASP.NET Core 的监听地址。

using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using System.Windows;

namespace WpfAircraftViewer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public string SourceUrl { get; set; }
        public MainWindow(IServer server)
        {
            InitializeComponent();
            // 这里通过注入的 IServer 对象来获取监听的 Url
            var addresses = server.Features.Get<IServerAddressesFeature>()?.Addresses;
            SourceUrl = addresses is not null ? (addresses.FirstOrDefault() ?? "http://localhost:5000") : "http://localhost:5000";
            // 无 VM,用自身当 VM
            DataContext = this;
        }
    }
}

这时我们就可以看到窗口打开了我们的 SPA 页面了。

标签:集成,Core,ASP,MainWindow,using,WebApplication,NET
From: https://www.cnblogs.com/aobaxu/p/18186785

相关文章

  • IDE-集成开发环境软件介绍
    IDE(IntegratedDevelopmentEnvironment,集成开发环境)**是一种用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。IDE通过把开发过程中用到的资源统一到一个界面中,可以显著提高编程效率。IDE通常支持多种编程语言,如C、C++、Java、Python等,......
  • windows安装metasploit,运行报错处理
    最近给几个windows11的系统安装了metasploit,其中有几个在启动msf时报错D:/metasploit-framework/embedded/framework/1ib/net/dns/resolver.rb:345:in'nameservers=':String,Wrongarguentformat,neitherString,ArraynorIPAddr(ResolverArgumentError)看起来像是dn......
  • 构建无服务器数仓(二)Apache DolphinScheduler 集成以及 LOB 粒度资源消费分析
    引言在数据驱动的世界中,企业正在寻求可靠且高性能的解决方案来管理其不断增长的数据需求。本系列博客从一个重视数据安全和合规性的B2C金融科技客户的角度来讨论云上云下混合部署的情况下如何利用亚马逊云科技云原生服务、开源社区产品以及第三方工具构建无服务器数据仓库的解......
  • post与.net core接受请求参数
    ///ffff constres=awaitinstancs.post(  "Know/DocList_Insert",  {   Id:1,   Name:"酷酷酷酷酷",   ClientId:1,   EqId:1,  },  {headers:{"Content-Type":"application/form-data"}} ......
  • Jenkins - 最流行的开源免费持续集成工具+Coverity - 知名的代码静态检测工具
    1、irtu-gps-基于iRTU项目实现GPS数据的接收和展示irtu-gps基于iRTU项目(一个开源的DTU/RTU解决方案,基于合宙硬件模块),实现了GPS数据的接收和展示,设备PCB开源/服务器端开源/小程序全开源。项目主页: https://gitee.com/wendal/irtu-gps技术特点:1.基于smart-socket的高性......
  • 嵌入式系统设计的轻量级框架+在Linux中用于外围设备访问C库+自研的编程语言和集成开发
    1、mr-library-一个专为嵌入式系统设计的轻量级框架mr-library是一个专为嵌入式系统设计的轻量级框架,模块化的软件架构充分考虑了嵌入式系统的资源和性能要求。通过提供标准化的设备管理等,极大地简化了嵌入式应用的开发难度,帮助开发者快速构建嵌入式应用程序。设备框架 为......
  • Core Impact 21.5 (Windows) - 高级渗透测试
    CoreImpact21.5(Windows)-高级渗透测试Fortra|CoreSecurityPenetrationtestingsoftware,ReleaseFeb2024请访问原文链接:CoreImpact21.5(Windows)-高级渗透测试,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCoreImpact渗透测试软件,安全地发现和......
  • SpringBoot集成微信APP支付
    目录废话不多说,先上代码上业务代码建议自己也看看官方文档,光C解决不了小问题。懂的吧代码随着微信支付的迭代可能会有啥问题,及时评论!废话不多说,先上代码application-dev.yml#支付pay:#支付回调通知地址notifyUrl:别想C填自己的#微信App支付weChat:别想C......
  • 免费试用在线SuiteCRM产品-简易定制或集成不收费
    您的组织或公司需要一个CRM细化针对性管理客户或商业机会朗读全文Yourbrowserdoesnotsupporttheaudioelement.介绍、用途及服务SugarCRM开源版是一款开放源代码的商业开源软件,具有界面活泼、简单易学的特点。SugarCRM公司是一间创立于2006年、但迅速在全球范围取得......
  • FFMpegCore 对音视频格式转换
    下载Nuget包FFMpegCore FFMpeg的官网下载转码程序点击Dowload 选择对应系统的下载源本次为Windows系统 选择Full标记的压缩包 解压后的文件结构ffmpeg版本 将bin文件夹下的ffmpeg.exe文件放置在程序项目的根目录下  视频格式转换以下是将.mov转.mp4///......