鸡肋还是革新——Blazor进WinForm

winform是一老技术,感觉都有点掉牙了(我近20年前就是从winform开始接触.net的);blazor,是微软技术圈里的新宠,正在被悉心照顾。当这一老一少的技术碰撞后,会有什么火花?

.net v6.0.0-preview.3,给winform和blazor结合带来了前提。https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/Blazor/BlazorWinForm  是我写的一个简单的demo,在winform窗体中引入blazor。

先看一下长什么样:

是一个简单的用助记码查询药品的例子,输入框查询按钮,table的样式都是Bootstrap5.0的,外层是一个winform的Form窗体。

具体实现,先看项目文件csproj的不一样:Sdk要换成Microsoft.NET.Sdk.Razor,然后是要通过nuget引入这些包。

<Project Sdk="Microsoft.NET.Sdk.Razor"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net6.0-windows</TargetFramework><UseWindowsForms>true</UseWindowsForms></PropertyGroup><ItemGroup><PackageReference Include="Dapper" Version="2.0.78" /><PackageReference Include="Microsoft.AspNetCore.Components.WebView.WindowsForms" Version="6.0.0-preview.3.21201.13" /><PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.3.21201.4" /><PackageReference Include="Microsoft.NET.Sdk.Razor" Version="5.0.0-preview.8.20414.8" /><PackageReference Include="System.Data.SqlClient" Version="4.8.2" /></ItemGroup><ItemGroup><Content Update="wwwroot\app.css"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Update="wwwroot\Query.razor"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Update="wwwroot\css\bootstrap.min.css"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Update="wwwroot\index.html"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content><Content Update="wwwroot\js\bootstrap.min.js"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content></ItemGroup><ItemGroup><None Update="wwwroot\app.css"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None><None Update="wwwroot\Query.razor"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><None Update="wwwroot\index.html"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None></ItemGroup>
</Project>

通过csproj也知道,我是添加了wwwroot文件夹,并添加了一些前端文件:

index.html是一个模板页,引入一些css和js

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><title>Blazor app</title><base href="/" /><link href="{PROJECT NAME}.styles.css" rel="stylesheet" /><link href="app.css" rel="stylesheet" /><link href="css/bootstrap.min.css" rel="stylesheet" />
</head><body><div id="app"  class="container"></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><script src="js/bootstrap.min.js"></script>
</body>
</html>

css和js就不说了,是前端的文件,重点看query.razor,这里实现了主要业务逻辑,业务数据+UI表现

@using Microsoft.AspNetCore.Components.Web
@using Dapper
@using System.Data.SqlClient;
<div class="row"><div class="col-1"></div><div class="col-10"><div class="input-group mb-3"><input type="text" class="form-control" id="zjm" placeholder="请输入助记码" @bind="ZJM" aria-describedby="button-addon2"><button class="btn btn-outline-secondary" type="button" @onclick="GetGoods" id="button-addon2">查询</button></div></div><div class="col-1"></div>
</div>
@code {private string ZJM { get; set; }List<Goods> list = new List<Goods>();void GetGoods(){using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString)){if (string.IsNullOrWhiteSpace(ZJM)){list = con.Query<Goods>("select top 30 spid,spmch,shpchd,shpgg from spkfk  ").ToList();}else{list = con.Query<Goods>("select top 30 spid,spmch,shpchd,shpgg from spkfk where zjm like @zjm ",new  {zjm="%"+ZJM+"%" }).ToList();}}}
}
<div class="row"><table class="table table-striped table-hover"><thead><tr class="table-dark"><th scope="col">编号</th><th scope="col">名称</th><th scope="col">产地</th><th scope="col">规格</th></tr></thead><tbody>@foreach (var item in list){<tr><td>@item.spid</td><td>@item.spmch</td><td>@item.shpchd</td><td>@item.shpgg</td></tr>}</tbody></table>
</div>

怎么引入到form窗体中呢?这里有点像之前的winform中引入一个webview,这里换成了BlazorWebView。

using BlazorWinForm.wwwroot;
using Microsoft.AspNetCore.Components.WebView.WindowsForms;
using Microsoft.Extensions.DependencyInjection;
using System.Windows.Forms;namespace BlazorWinForm
{public partial class frmMain : Form{public frmMain(){InitializeComponent();var serviceCollection = new ServiceCollection();serviceCollection.AddBlazorWebView();var blazor = new BlazorWebView(){Dock = DockStyle.Fill,HostPage = "wwwroot/index.html",Services = serviceCollection.BuildServiceProvider(), };blazor.AutoScroll = false;blazor.RootComponents.Add<Query>("#app");Controls.Add(blazor);}}class Goods{public string spid { get; set; }public string spmch { get; set; }public string shpchd { get; set; }public string shpgg { get; set; }}
}

总体下来,这种把winform+c#+html,css,js混合起来编程,即把丰富的前端框架引入进来,让winform表现更加灵活,强大,也不丢失cs架构对当前电脑的控制力(有很多行业是通过exe来对接专有设备的驱动的)。winform的UI之前是通过三方UI控件比如DevExpress来增强的,虽然有WPF,但还是在微软自己画的一个圈圈里转,blazor则是带来了丰富的前端库。另外,与之前winform嵌入webview不一样的是,blazor中的c#,可以方便的和winform来互动,语言相通,直接交流,比如你可以很轻松的在blazor的页里里new一个form出来。

Blazor进winform,是鸡肋还是革新?应该是仁者见仁,智者见智了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个女程序员征男友的需求说明书

前 言常听人说程序员的生活枯燥为人刻板&#xff0c;其实这是你不懂程序员。代码之外&#xff0c;生活之中&#xff0c;这些高智商人的幽默风趣&#xff0c;才华的展现往往能在「论坛」这个神奇的领域一窥究竟。&#xff08;悲哀&#xff0c;因为给他们展现Coder之外才华的地方…

查看服务器物理内存大小,如何看服务器的物理内存大小

如何看服务器的物理内存大小 内容精选换一换JVM在执行Java程序时会把它所管理的内存划分为若干个不同的运行时数据区域&#xff0c;主要包括&#xff1a;程序计数器、方法区、虚拟机栈、本地方法栈和堆&#xff1a;程序计数器可以看作时当前线程所执行的字节码的行号指示器。方…

通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

之前的章节我们介绍了如何通过dapr发起一个服务调用&#xff0c;相信看过前几章的小伙伴已经对dapr有一个基本的了解了&#xff0c;今天我们来聊一聊dapr的另外一个功能——订阅发布目录&#xff1a;一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简…

值得收藏的Python小技巧:这17个骚操作你都OK吗?

导读&#xff1a;Python 是一门非常优美的语言&#xff0c;其简洁易用令人不得不感概人生苦短。在本文中&#xff0c;作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧&#xff0c;例如查找、分割和合并列表等&#xff0c;这 17 个技巧都非常简单&#xff0c;但…

等待十年,史上第一个 64 位版 Visual Studio 将于今夏公开首个预览版!

昨日&#xff0c;微软在其开发者博客宣布了一则重磅消息——Visual Studio 2022 首个预览版将于今年夏季发布 &#xff0c;并且终于成为万众期待的 64 位版&#xff01;要知道&#xff0c;早在 2011 年就有用户在 Visual Studio 的反馈建议网站提出&#xff0c;希望微软开发 64…

普通人和程序员看到的树

IT程序猿 微博网友评论&#xff1a;小苏打_sct&#xff1a;我家门前有两棵树&#xff0c;一棵是二叉树&#xff0c;另一棵也是二叉树( _ゝ&#xff40;)Christible_L&#xff1a;这不是多叉树吗 北辰找不着北&#xff1a;程序员都是从根看起的~ 洱海不语&#xff1a;先先总体到…

华为高性能服务器刀箱,云平台服务器刀箱

云平台服务器刀箱 内容精选换一换将外部镜像文件注册成云平台的私有镜像后&#xff0c;您可以使用该镜像创建新的云服务器&#xff0c;或对已有云服务器的系统进行重装和更换。本节介绍使用镜像创建云服务器的操作。您可以按照通过镜像创建云服务器中的操作指导创建弹性云服务器…

Magicodes.IE.AspNetCore之一行代码多格式导出

主要步骤1.安装包Install-Package Magicodes.IE.AspNetCore2.开始配置在Startup.cs的Configure()方法中,在UseRouting()中间件之后,注册如下中间件public void Configure(IApplicationBuilder app) {app.UseRouting();app.UseMagiCodesIE();app.UseEndpoints(endpoints >{en…

想不到吧,这些都能用R!

R作为一种统计分析软件&#xff0c;广泛应用于生物、医学、电商、新闻等数据相关行业&#xff0c;是目前主流数据应用软件之一。那么&#xff0c;R到底有哪些特别之处呢?实际上&#xff0c;R是统计领域广泛使用的S语言的一个分支&#xff0c;两者在程序语法上几乎一样&#xf…

ssd windows未能启动服务器,ssd安装win10无法启动你安装方法对吗?来看一下

固态硬盘虽然价格偏高&#xff0c;但是读写速度快&#xff0c;很多人只追求速度&#xff0c;纷纷买了全新固态硬盘安装系统&#xff0c;现在最新的系统是win10&#xff0c;如果在uefi电脑上用固态硬盘安装win10&#xff0c;那么速度将有质的提升&#xff0c;那么全新固态硬盘怎…

一名IT经理是如何把项目带崩的。。。

我是一名项目经理&#xff0c;在过去的四个月里&#xff0c;我把一个项目带崩了&#xff08;上线后频出问题&#xff0c;用户无法使用&#xff09;。在最近的几天&#xff0c;我每天都在反思自己&#xff0c;我都在问自己以下几个问题&#xff1a;1.我做错了什么&#xff1f;2.…

C# 线程池ThreadPool用法简介

前言&#xff1a;自从task出现后&#xff0c;threadpool地位直线下降&#xff0c;但是一些老的程序员用惯了threadpool&#xff0c;我们在继承开发的时候也会时常看到这个用法&#xff0c;所以我们也很有必要熟悉认识它。什么是线程池&#xff1f;为什么要用线程池&#xff1f;…

10分钟采集凡客最新的省、市、区、邮政编码和电话区号(附源码)

最近的开发的项目需要用到省、市、区数据&#xff0c;因为要开发的项目也是电子商务网站&#xff0c;在参考凡客的用户体验时&#xff0c;发现它连深圳最新分离出来的光明新区都有了&#xff0c;拍拍网都没有更新数据&#xff0c;看来凡客在数据更新方面还是挺负责的&#xff0…

刘强东在美国出事了,老老实实的IT男,真的是有钱就变坏吗?

9月2日&#xff0c;网络上流传京东集团创始人刘强东在美国明尼苏达州&#xff0c;涉嫌性侵女大学生&#xff0c;目前已经被保释的消息。刘强东的相关信息&#xff0c;是可以直接在明尼苏达州Hennepin郡治安官办公室的监狱名单上查到的。上图中&#xff0c;可以看到指控描述为cr…

记一次 .NET游戏站程序的 CPU 爆高分析

一&#xff1a;背景 1. 讲故事上个月有个老朋友找到我&#xff0c;说他的站点晚高峰 CPU 会突然爆高&#xff0c;发了两份 dump 文件过来&#xff0c;如下图&#xff1a;又是经典的 CPU 爆高问题&#xff0c;到目前为止&#xff0c;对这种我还是有一些经验可循的。抓 2-3 个 du…

干货 | 数据挖掘过关40题

今天为大家准备了40道数据挖掘的题&#xff0c;试试你的能力吧&#xff01;答案请见文末1.某超市研究销售纪录数据后发现&#xff0c;买啤酒的人很大概率也会购买尿布&#xff0c;这种属于数据挖掘的哪类问题&#xff1f;A.关联规则发现B.聚类C.分类D.自然语言处理2.以下两种描…

.Net程序内存泄漏解析

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。本期内容分享实战中内存泄漏解决思路。Part1 初步分析原因Part2 查找内存泄漏的根本原因Part2.1 解决方案Part3 总结Part4 彩蛋一、概要大概在今年三月份的时候突然被紧急调到另外一个项目组解决线上内存泄漏问题。…

js 上下箭头滚动_JS中的this完全讲解,再也不会被this搞晕了

关于This对象js 中的this 是一个比较难理解的对象&#xff1b;所以也经常作为面试的考点&#xff0c;考察应聘者的js 基础能力&#xff1b;其实this的指向也就那么几种情况&#xff0c;接下来我们一一看一下&#xff1a;函数中的this取何值是在函数真正被调用时确定的(也就是运…

9张图,Kafka为什么要放弃Zookeeper

最近&#xff0c;confluent社区发表了一篇文章&#xff0c;主要讲述了Kafka未来的2.8版本将要放弃Zookeeper&#xff0c;这对于Kafka用户来说&#xff0c;是一个重要的改进。之前部署Kafka就必须得部署Zookeeper&#xff0c;而之后就只要单独部署Kafka就行了。[1]1.Kafka简介Ap…

Python能用来做什么?以下是Python的三大主要用途

如果你想学Python&#xff0c;或者你刚开始学习Python&#xff0c;那么你可能会问&#xff1a;“我能用Python做什么&#xff1f;”这个问题不好回答&#xff0c;因为Python有很多用途。但是随着时间&#xff0c;我发现有Python主要有以下三大主要应用&#xff1a; Web开发 数据…