[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发

避坑,c#开发人员学习开发app时.NET MAUI和Vue3 选择 适合需要高性能原生应用、已有C#技术积累、或需快速迭代企业级应用(如内部工具、数据采集App)的场景。典型案例:跨平台办公软件、物联网设备控制端。适合轻量级应用、偏好Web技术栈、或需高度定制UI(如电商、社交类App)。经过一段时间学习vue3后才发现作为一个C#背景的开发人员从开发效率、调试便捷性、部署便利性考虑,建议优先尝试.NET MAUI,若项目需求偏向Web或已有Vue3经验,再考虑后者。是更合适的选择,尤其是在跨平台原生应用开发场景中。 阅读详情


.NET MAUI结合Vue的混合开发可以使用更加熟悉的Vue的语法代替Blazor语法,你现有项目不必重写。之前写过一篇 [MAUI] 在.NET MAUI中结合Vue实现混合开发 ,其中介绍了如何创建一个vue应用并将其打包至MAUI项目,这种方式依赖vue-cli创建和打包静态站点,好处是可以使用Node.js 的构建但MAUI仅仅作为容器。开发应用需要一个独立的host项目

这次用集成的方式。将vue作为MAUI的一部分,这样就可以在MAUI项目中直接使用vue了。

在这里插入图片描述

Vue在混合开发中的特点

首先要说的是,Vue框架是渐进性的,所谓渐进性,就是Vue不会强求你使用所有的框架特性,你可以根据需要逐步使用。

同样地,element-ui也可以通过引入样式和组件库,配合Vue使用

因此我们不需要Vue Router、Vuex、Vue CLI、单文件组件这些高级特性,仅仅引入Vue.js即可使用Vue模板语法。我们将利用Blazor引擎的如下功能:

  • 组件化开发
  • 静态资源管理
  • js代码的注入
  • js调用C#代码
  • C#调用js代码

由.NET MAUI提供的功能:

  • 路由管理
  • 状态管理

由Vue提供模板语法,事件处理,计算属性/侦听器等,以及Element-UI提供交互组件。

创建MAUI项目

创建一个MAUI项目,这里使用的是Visual Studio 2022 17.7.3,创建一个Blazor MAUI App项目命名MAUI-Vue-Hybriddev-Integrated,选择Android和iOS作为目标平台,选择.NET 7.0作为目标框架。

在这里插入图片描述

从Vue官网下载最新的Vue.js

在这里插入图片描述

将其放置在wwwroot目录下,然后在index.html中引入
在这里插入图片描述

    <script src="lib/vuejs/vue.js"></script>

创建Vue应用

在Views目录下创建 HomePage.xaml作为Vue应用的容器,在页面中创建<BlazorWebView>视图元素,并设置HostPage为wwwroot/index.html,这样就可以在MAUI中使用Vue了。

<BlazorWebView x:Name="blazorWebView"
               HostPage="wwwroot/index.html">
    <BlazorWebView.RootComponents>
        <RootComponent Selector="#app"
                       x:Name="rootComponent"
                       ComponentType="{x:Type views:HomePageWeb}" />
    </BlazorWebView.RootComponents>
</BlazorWebView>

每个BlazorWebView控件包含根组件(RootComponent)定义,ComponentType是在应用程序启动时加载页面时的类型,该类型需要继承自Microsoft.AspNetCore.Components.IComponent,由于我们的导航是由MAUI处理的,因此我们不需要使用Blazor路由,直接使用Razor组件

在Views目录下创建HomePageWeb.razor,这是Vue应用页面相当于Vue的单文件组件,这里可以使用Vue的模板语法,而不是Blazor的Razor语法。
在这里插入图片描述

我们在HomePageWeb.razor中写下Vue官方文档中Hello Vue示例代码


<div id="vue-app">
    {{ message }}
</div>


<script type="text/javascript">
    var app = new Vue({
        el: '#vue-app',
        data: {
            message: 'Hello Vue!',
        }
    })

</script>

注意:Vue的根元素名称不要跟Blazor的根元素名称相同,否则会报错。

在这里插入图片描述

此时更改JavaScript里的内容,你会发现Blazor页面不会热加载。

请勿将 <script> 标记置于 Razor 组件文件 (.razor) 中,因为 <script> 标记无法由Blazor 动态更新。

于是需要将script部分代码放置在外部,此时有两种方案,一个是放在wwwroot/js目录下,然后在wwwroot/index.html中引入,还有一种是使用并置的js文件,这种方式是所谓的"CodeBehind",因为更利于组织代码,这里我们使用并置的js文件。

创建一个HomePageWeb.razor.js文件,将script部分代码放置在其中,然后在HomePageWeb.razor中引入

在这里插入图片描述

protected override async Task OnAfterRenderAsync(bool firstRender)
{

    if (firstRender)
    {
        await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./Views/HomePageWeb.razor.js");
    }
}

发布应用后,框架会自动将脚本移动到 Web 根目录。 在此示例中,脚本被移动到./wwwroot/Views/HomePageWeb.razor.js

使用element-ui组件库

同样,我们在element-ui官方CDN下载样式文件和组件库,首先在index.html中引入样式和组件库

<link href="css/app.css" rel="stylesheet" />
...
<script src="lib/element-ui/index.js"></script>

然后在HomePageWeb.razor中使用组件

<div id="vue-app">
    {{ message }}
    <el-input v-model="input" placeholder="请输入内容"></el-input>
    <el-button @click="showDialog = true">提交</el-button>
    <el-dialog :visible.sync="showDialog" title="消息">
        <p>{{input}}</p>
        <p>提交成功</p>
    </el-dialog>
</div>

CodeBehind中引入组件

var app = new Vue({
    el: '#vue-app',
    data: {
        message: 'Hello Vue!',
        showDialog: false,
        input: 'text message from vue'
    }
})

运行效果如下:

在这里插入图片描述

在这里插入图片描述

JavaScript和原生代码的交互

Blazor组件中的代码可以通过注入IJSRuntime来调用JavaScript代码,JavaScript代码可以通过调用DotNet.invokeMethodAsync来调用C#代码。

传递根组件参数

如果被调用的代码位于其他类中,需要给这个Blazor组件传递实例,还记得刚才提及的根组件(RootComponent)吗?我们用它来传递这个实例,称之为根组件参数,详情请查看官方文档 在 ASP.NET Core Blazor Hybrid 中传递根组件参数

创建SecondPage.xaml,根据刚才的步骤创建一个BlazorWebView并注入vuejs代码
html部分创建一个el-dialog组件,当消息被接收时,显示对话框


@using Microsoft.Maui.Controls
@inject IJSRuntime JSRuntime

<div id="vue-app">
    {{ message }}
    <el-dialog :visible.sync="showDialog" title="Native device msg recived!">
        <p>{{msg}}</p>
    </el-dialog>
</div>

在@code代码段中创建SecondPage对象。


@code {

    [Parameter]
    public SecondPage SecondPage { get; set; }

    ...
}

回到SecondPage.xaml.cs,在构造函数中将自己传递给根组件参数

public SecondPage()
{
    InitializeComponent();
    rootComponent.Parameters =
        new Dictionary<string, object>
        {
            { "SecondPage", this }
        };
}


从设备调用Javascript代码

在SecondPage.xaml中,创建一个Post按钮,点击按钮后将文本框PostContentEntry的内容传递给Vue代码

<StackLayout Grid.Row="1">
    <Entry x:Name="PostContentEntry" Text="Hello,this is greetings from native device"></Entry>
    <Button Text="Post To Vue"
            HorizontalOptions="Center"
            VerticalOptions="End"
            HeightRequest="40"
            Clicked="Post_Clicked"></Button>

</StackLayout>

在这里插入图片描述

在SecondPage.razor.js中, 创建greet方法,用于接收从原生代码传递过来的参数,并显示在对话框中。

window.app = new Vue({
    el: '#vue-app',
    data: {
        message: 'Vue Native interop',
        showDialog: false,
        msg: ''
    },
    methods: {
        greet: function (content) {
            this.msg = content;
            this.showDialog = true;
        }

    },

在SecondPage.xaml.cs中,创建一个OnPost事件,当Post按钮被点击时触发该事件


public event EventHandler<OnPostEventArgs> OnPost;

private void Post_Clicked(object sender, EventArgs args)
{
    OnPost?.Invoke(this, new OnPostEventArgs(this.PostContentEntry.Text));
}


在SecondPage.razor中,订阅OnPost事件,当事件被触发时,调用greet方法,将参数传递给JavaScript代码


public async void Recived(object o, OnPostEventArgs args)
{
    await JSRuntime.InvokeAsync<string>("window.app.greet", args.Content);
}

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    try
    {
        if (firstRender)
        {
            SecondPage.OnPost += this.Recived;

            await JSRuntime.InvokeAsync<IJSObjectReference>(
"import", "./Views/SecondPageWeb.razor.js");

        }


    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

}

在页面销毁时,要取消订阅事件,避免内存泄漏。


@implements IDisposable

...

public void Dispose()
{
    SecondPage.OnPost -= this.Recived;
}


运行效果如下

在这里插入图片描述

从Vue页面调用原生代码

原生代码指的是.NET MAUI平台的C#代码,比如要在设备上显示一个弹窗,需要调用Page.DisplayAlert方法,它隶属于Microsoft.Maui.Controls命名空间,属于MAUI组件库的一部分。

因此需要将MAUI类型的对象通过引用传递给JavaScript调用,调用方式是通过将对象实例包装在 DotNetObjectReference 中传递给JavaScript。使用该对象的invokeMethodAsync从 JS 调用 .NET 实例方法。详情请查看官方文档 JavaScript 函数调用 .NET 方法

在@code代码段中,界面加载时创建DotNetObjectReference对象

@code {
    private DotNetObjectReference<SecondPageWeb>? objRef;


    protected override void OnInitialized()
    {
        objRef = DotNetObjectReference.Create(this);
    }

页面加载完成时,将DotNetObjectReference对象传递给JavaScript代码


protected override async Task OnAfterRenderAsync(bool firstRender)
{
    try
    {
        if (firstRender)
        {
            SecondPage.OnPost += this.Recived;

            await JSRuntime.InvokeAsync<IJSObjectReference>(
"import", "./Views/SecondPageWeb.razor.js");
            await JSRuntime.InvokeAsync<string>("window.initObjRef", this.objRef);

        }


    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

}

window.app = new Vue({
    
    ...

    data: {
        ...
        objRef: null
    },
    
})
window.initObjRef = function (objRef) {
    window.app.objRef = objRef;
}

在SecondPage.razor中,创建el-input组件和el-button组件,当按钮被点击时,调用Post方法,将文本框的内容传递给原生代码

<div id="vue-app">
    {{ message }}
    <el-input v-model="input" placeholder="请输入内容"></el-input>
    <el-button @click="post">Post To Native</el-button>
    <el-dialog :visible.sync="showDialog" title="Native device msg recived!">
        <p>{{msg}}</p>
    </el-dialog>
</div>

按钮和对话框的显示逻辑与之前相同,不再赘述。

在这里插入图片描述

在SecondPage.razor中,创建Post方法,方法被调用时,将触发MAUI组件库的原生代码

[JSInvokable]
public async Task Post(string content)
{
    await SecondPage.DisplayAlert("Vue msg recived!", content, "Got it!");

}

vue绑定的函数中,调用DotNet.invokeMethodAsync将文本框的内容传递给原生代码


window.app = new Vue({
    el: '#vue-app',
    data: {
        message: 'Vue Native interop',
        showDialog: false,
        msg: '',
        input: 'Hi, I am a text message from Vue',
        deviceDisplay: null,
        objRef: null
    },
    methods: {
        greet: function (content) {
            this.msg = content;
            this.showDialog = true;
        },
        post: function () {
            this.objRef.invokeMethodAsync('Post', this.input);
        }


    }
})

运行效果如下

在这里插入图片描述

读取设备信息

可以使用Vue的watch属性监听数据变化,当MAUI对象加载完成时,调用原生代码,读取设备信息

<div id="vue-app">

    ...

    <p>Device Display</p>
    <p>{{deviceDisplay}}</p>
</div>

CodeBehind代码如下:

watch: {
    objRef: async function (newObjRef, oldObjRef) {
        if (newObjRef) {
            var deviceDisplay = await this.objRef.invokeMethodAsync('ReadDeviceDisplay');
            console.warn(deviceDisplay);
            this.deviceDisplay = deviceDisplay;
        }

    }
},

原生代码如下:


[JSInvokable]
public async Task<string> ReadDeviceDisplay()
{
    return await Task.FromResult(SecondPage.ReadDeviceDisplay());

}

在ReadDeviceDisplay方法中,我们读取设备分辨率、屏幕密度、屏幕方向、屏幕旋转、刷新率等信息

public string ReadDeviceDisplay()
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();

    sb.AppendLine($"Pixel width: {DeviceDisplay.Current.MainDisplayInfo.Width} / Pixel Height: {DeviceDisplay.Current.MainDisplayInfo.Height}");
    sb.AppendLine($"Density: {DeviceDisplay.Current.MainDisplayInfo.Density}");
    sb.AppendLine($"Orientation: {DeviceDisplay.Current.MainDisplayInfo.Orientation}");
    sb.AppendLine($"Rotation: {DeviceDisplay.Current.MainDisplayInfo.Rotation}");
    sb.AppendLine($"Refresh Rate: {DeviceDisplay.Current.MainDisplayInfo.RefreshRate}");

    var text = sb.ToString();
    return text;
}

当页面加载时,会在HTML页面上显示设备信息

在这里插入图片描述
​

项目地址

Github:maui-vue-hybirddev

关注我,学习更多.NET MAUI开发知识!

​

MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI 距离上次发《MAUI初体验:爽》一文已经过去2个月了,本计划是下半年或者明年再研究MAUI的,现在计划提前啦,因为我觉得MAUI Blazor挺有意思的:在Android、iOS、macOS、Windows之间共享UI,一处UI增加或者修改,就能得到一致的UI体验。看看这篇文章《Blazor Hybrid/MAUI 简介和实战》对MAUI Blazor的说明:今天就分享如何在Blazor Server、Blazor Wasm、MAUI Blazor之间共享UI的实验,这一步完成,后面开发应用时就方便多了(只 阅读详情

相关推荐

maui blazor开发app 试写一个简单的登陆界面

而MAUI更是能够实现跨平台开发,现在还发现了MAUI Blazor,简直就像是购买了一瓶白酒,里面还意外中了一张奖券,全都是额外赠送的好处。多年前,我在开发ASP.NET MVC时曾使用Blazor构建了一个烘手器的网站,并成功将其优化至百度搜索排名第一。pages下面有三个子页,通过分析NavMenu.razor 则点击菜单跳转到href,跳转到三个页面中的一个。wwwroot下的index.html感觉是一个WEB服务一样,这里的/表示把 定义的路由页当首页。菜单NavMenu.razor。

大白菜代码的博客 2321

[MAUI] 在.NET MAUI中结合Vue实现混合开发

在MAUI微软的官方方案是使用Blazor开发,但是当前市场大多数的Web项目使用Vue,React等技术构建,如果我们没法绕过已经积累的技术,用Blazor重写整个项目并不现实。 Vue是当前流行的web框架, 简单来说是一套模板引擎,利用“模板”和“绑定”两大特性实现web页面mvvm模式开发。利用.NET MAUI框架可以将Vue应用嵌入到Web容器中。可以实现跨平台的混合开发。 例如我在某医疗行业项目中,已经用这个混合开发的方式生成应用,Vue代码不需要做什么改动,就能跨平台运行: 如果你

jevonsflash的专栏 8676

Blazor与Vue:.NET下可维护性的对比

Blazor基于C#语言和.NET生态系统,而Vue则使用JavaScript和Vue生态系统,开发者可以根据自己的喜好和项目需求选择适合的框架。Blazor利用C#语言和.NET工具生态系统的优势,而Vue则通过组件化的结构提供了更灵活和模块化的代码编写方式。Vue则使用JavaScript和Vue生态系统,通过组件化的结构和灵活的数据绑定方式实现了可维护性强的开发模式。Blazor和Vue都是在.NET开发环境下可维护性强的前端框架,它们在代码结构、组件化、数据绑定和工具生态系统等方面都有各自的优势。

library_git106的博客 1423

学习.NET MAUI Blazor(二)、MAUI是个啥

`.NET MAUI,全称.NET Multi-platform App UI` 顾名思义,就是跨平台UI框架。使用.NET MAUI,**理论**上使用一套代码就可以开发出可运行在 Android、iOS、macOS 和 Windows 上的应用

What If... 4535

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 814

采用LM324输出方波、正弦波、三角波

介绍以LM324运放芯片为核心,设计电路连接,实现三角波转化为正弦波,再由正弦波转化为方波输出的简易函数信号发生器的基本功能。本文介绍通过使用NI Multisim 14.0软件仿真模拟搭建所设计的电路,再使用这个软件的示波器进行仿真输出三角波,正弦波,方波。使用软件进行仿真后再到实验室进行调试,将其接入电源,并通过在显示器上观察波形以及数据,得到结果。该电路结构简单,信号的幅度、频率等参数可调,在仿真软件和实验室检测都有较好的性能输出,可替代实验室标准的函数信号发生器完成一般的实验要求。

qq_48771816的博客 7万+

Blazor 混合开发_MAUI+Vue_WPF+Vue

在 MAUI 微软的官方方案是使用 Blazor 开发,但是当前市场大多数的 Web 项目使用 Vue、React 等技术构建,用Blazor重写整个项目并不现实。利用 .NET MAUI 框架可以将 Vue 应用嵌入到 Web 容器中,可以实现跨平台的混合开发。将 dist 文件夹下的所有文件复制到容器项目下的 wwwroot 文件夹下。Vue 是当前流行的 Web 框架, 简单来说是一套模板引擎,利用。第一个参数是容器项目的 Namespace,第二个参数是要调用的方法。导入 namespace。

视觉软件 2822

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.csdn.net/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4192

[MAUI] 混合开发概念

混合开发的概念是相对与原生开发来说的:App不直接运行原生程序,而是在原生程序中运行一个Web程序,原生程序中包含Web运行时,用于承载Web页面。暂且将原生应用称之为Web容器,Web容器应该能让JavaScript代码与原生平台的代码交互,互相调用,同时为上层提供交互逻辑,例如导航,事件,Cookie,刷新等内容。 之前使用Xamarin可以利用WebView控件做混合开发,但是到目前为止WebView功能还是比较孱弱。用WebView实现混合开发主要是通过重写各个平台的自定义呈现器(Renderer

jevonsflash的专栏 3068

2026款拯救者Y9000P深度学习环境配置指南

这套环境适配 2026 款拯救者 Y9000P 的 RTX5060,可直接用于 CV(图像分类、检测)、NLP 等 PyTorch 深度学习任务,GPU 利用率正常,无兼容性问题。后续复现环境时,直接按本文步骤操作即可~

大糊涂虫 2643

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

学习.NET MAUI Blazor(一)、Blazor是个啥?

.NET Blazor(以下统称Blazor)是.NET Core 3.0推出的一个Web UI框架,如果对Vue比较熟悉的话,会感觉它们及其类似,毕竟嘛,现代前端框架的底层逻辑都基本一致(DOM差量更新、响应式、组件化等)。

What If... 2840

【数据挖掘】遗传算法原理浅析:什么是遗传算法?遗传算法的工作原理是什么?

遗传算法(Genetic Algorithm,GA),是进化算法的框架和核心。 各种进化算法有什么异同? - 及时物语的回答 - 知乎 https://www.zhihu.com/question/39152390/answer/901070749

纸羊同学的博客 4280

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

地图组件在手机App中常用地理相关业务,如查看线下门店,设置导航,或选取地址等。是一个较为常见的组件。在.NET MAUI 中,有两种方案可以集成高德地图,一种是使用原生库绑定。但这种方案需要大量平台原生开发的知识,而且需要对每一个平台进行适配。在这里我介绍第二种方案:.NET MAUI Blazor + 高德地图JS API 2.0 库的实现。JS API 2.0 是高德开放平台基于WebGL的地图组件,可以将高德地图模块集成到.NET MAUI Blazor中的BlazorWebView控件。

jevonsflash的专栏 2214

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

man multi_driven_net”可以得知,这个问题是multi driven结构引起的,使用命令“get_failed_pins -reason multi_driven_net”,获取violation pin。“man incomplete_timing_cell”可以得知,这个fail reason的原因是缺少timing library cell,检查并补全后这个错误就显示了。这里选择的解决方法是修改lib文件,把inout改成input,重新lib2idb。通过这种方法解决了问题。

m0_61544122的博客 567

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3609

Blazor 概述、与Vue/React综合比较以及应用场景探讨

Blazor 是一个强大且灵活的框架,凭借其统一的技术栈和强大的生态系统,适合构建各种现代 Web 应用。从简单的入门教程开始,到深入了解组件、状态管理和 API 集成,你可以逐步掌握 Blazor 的强大能力,并通过参与开源项目或实际应用开发来提升技能。无论你是 .NET 开发者,还是想尝试前端开发的后端工程师,Blazor 都是一个非常值得学习的选择!Blazor 是一个为 .NET 开发者量身定制的工具,其最大优势在于开发一致性和生态整合。

码事漫谈 2219

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

淘汰过时的工具也有错?微软的 Blazor 框架会是下一个 SilverLight?

在 HTML5 的冲击下,和 Adobe Flash Player 的发展趋势相类似,微软投入十几年时间打造的 Silverlight 最终也走向消亡,原因主要是 Silverlight 的安全性和性能无法实现理想状态。据官方消息,微软将于 2021 年 10 月 12 日停止对 Silverlight 的官方支持。 与此同时,微软在彼时宣布准备弃用 Silverlight 时也给出了另一替代解决方案,即发布一款名为 Blazor 的新框架。据官方介绍,Blazor 分为服务端模式和客户端应用的 WebAs

一起来捉 Bug 呀~~ 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于最新的MAUI混合VUE3开发Android应用(2022-11-01)

微软MAUI框架集成VUE3开发,支持js调用C#方法

weixin_46545658的博客 5340

.NET开发主流框架全方位对比分析

.NET主流框架概览 ASP.NET Core是高性能跨平台Web框架,支持Razor Pages和MVC模式,适合现代Web开发。.NET MAUI取代Xamarin,用于构建跨平台原生应用,支持单一代码库多平台部署。Blazor允许使用C#开发交互式Web UI,提供服务器和WebAssembly两种托管模式。WPF仍是构建Windows桌面应用的首选,具备丰富的UI定制能力。Entity Framework Core作为主流ORM,简化数据访问并支持多种数据库。SignalR专为实时Web功能设计,自

百锦再的博客 4329

WinForm、WPF、MAUI、Blazor,考虑哪些因素?

纯个人观点:现在用.net还在开发桌面程序的,基本上都在工业和制造业领域. 这种环境下面,基本上不分啥前端后端, 都是一个人从头干到尾.选自己熟悉的技术就行.如果要注重界面开发就要抛开.net这个大环境看, 比如现在微软主推的MAUI, 还有WebView2, Electron, QT等.另外既然考虑界面了,大多数情况下可以选择Web方式. 可以服务端和设备通信,或者Web和桌面混合开发.现在还有...

dotNET跨平台 884

.net framework开发winform_基于.NET 5.0跨平台全栈开发福音来了

2020.11.10日DOTNET正式发布.NET 5.0,.NET 5.0 是 3.1 之后 .NET Core 的下一个主要版本,可以理解为.NET 5.0 = .net core vnext。为不叫 .NET Core 4.0 官网上描述主要有两个原因:1. 跳过了版本号 4.x 以避免与 .NET Framework 4.x 混淆;2. 从名称中删除了"Core",以强调这是 .NET 前...

weixin_39602891的博客 5691

从零构建跨平台桌面应用,C# + .NET MAUI 9.0实战全流程详解

掌握C#实现跨平台桌面应用(.NET MAUI 9.0+Blazor Hybrid)的完整流程,解决多平台开发效率难题。涵盖环境搭建、界面设计、前后端集成及发布部署,适用于Windows、macOS和Linux应用开发。融合Blazor Hybrid的Web与原生优势,提升开发效能,值得收藏。

PoliSeed的博客 1296

3. 【Blazor全栈开发实战指南】--Blazor是什么?为什么选择Blazor?

在Web开发领域,前端技术栈的演进速度令人目不暇接。从传统的JavaScript、jQuery到Angular、React、Vue等现代前端框架,开发者们一直在追求更高效、更强大、更易维护的解决方案。然而,对于广大的.NET开发者而言,长期以来,前端开发意味着需要跳出C#的舒适区,学习并掌握一套全新的语言(JavaScript/TypeScript)和框架。这种技术栈的分裂,不仅增加了学习成本,也导致了前后端开发协作中的诸多不便。

喵叔 3160

学习.NET MAUI Blazor(四)、路由

Web应用主要是使用a标签或者是服务端redirect来跳转。而现在流行的单页应用程序 (SPA) ,则通过路由(Router)来实现跳转,如Vue 、React等。在.NET MAUI Blazor应用中,路由是遵循Blazor的路由规则。也是通过路由组件(Router)实现的

What If... 2523
上一篇: [MAUI]实现动态拖拽排序网格
下一篇: ExcelPatternTool 开箱即用的Excel工具包现已发布!
林晓lx
林晓lx 2017年优快云移动跨平台大赛优秀奖获得者 2017年优快云移动跨平台大赛优秀奖获得者
博客等级 码龄15年 3761粉丝 124原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林晓lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值