首页 > 其他分享 >Blazor Hybrid 实战体验:那些你可能没预料到的坑没预料到的坑

Blazor Hybrid 实战体验:那些你可能没预料到的坑没预料到的坑

时间:2024-10-11 14:43:46浏览次数:6  
标签:文件 桌面 处理 预料到 Hybrid Blazor 拖放

前言

昨天写了一篇介绍 Blazor Hybrid 技术的文章,但限于篇幅,一些问题未能深入探讨。今天,我想继续记录使用 Blazor Hybrid 过程中遇到的几个问题,以及这个技术目前的一些局限性。

文件拖放事件的局限

Blazor Hybrid 的运行环境是 WebView,这导致了在处理文件拖放时出现了一些限制。在传统桌面应用中(如 WinForms 或 WPF),开发者可以直接捕获拖放事件,并获得文件的完整路径。但在 Blazor 中,拖放事件只能像浏览器中一样处理,意味着我们只能获得上传文件的流,而无法获取文件的实际路径。

这对于那些需要直接访问文件路径的功能(如Clipify中把视频拖进去处理)带来了很大的不便。

冗余代码(不是)

看了项目代码的同学可能会发现,FormMain.cs里还有处理拖放事件的代码,不过实际上并没有生效。

// 处理拖动进入事件,检测是否为文件
private void blazorWebView1_DragEnter(object sender, DragEventArgs e) {
  Console.WriteLine("drag enter");
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    // 改变鼠标图标,表示可以拖放
    e.Effect = DragDropEffects.Copy;
  }
  else {
    e.Effect = DragDropEffects.None;
  }
}

// 处理拖放事件,获取文件路径
private void blazorWebView1_DragDrop(object sender, DragEventArgs e) {
  Console.WriteLine("drag drop");
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    var files = (string[]?)e.Data.GetData(DataFormats.FileDrop);

    // 这里只处理单个文件,当然你也可以处理多个文件
    if (files?.Length > 0) {
      var filePath = files[0]; // 获取拖放的文件路径
      MessageBox.Show($"文件路径: {filePath}");

      // 在这里你可以将文件路径传递给 Blazor 或其他处理逻辑
    }
  }
}

// 处理 DragOver 事件,防止系统默认行为
private void blazorWebView1_DragOver(object sender, DragEventArgs e) {
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    e.Effect = DragDropEffects.Copy; // 明确允许拖放文件
  }
  else {
    e.Effect = DragDropEffects.None;
  }
}

解决方案

目前的解决办法有限,根据查找到的资料和我自己的探索,有以下几种:

  1. 在需要拖放的时候,使用一个WinForms原生控件覆盖webview
  2. 使用hook技术,拦截webview的拖放事件
  3. 重写微软提个的这个 Blazor Webview 控件,自己实现 WndProc 方法

第3种方法的代码大概是这样(未验证)

public class CustomBlazorWebView : BlazorWebView {
  protected override void WndProc(ref Message m) {
    const int WM_DROPFILES = 0x233; // 拖放文件消息

    if (m.Msg == WM_DROPFILES) {
      // 处理文件拖放逻辑
      // 你可以在这里调用你的拖放事件处理逻辑

      // 阻止消息传递,避免系统默认处理文件
      return;
    }

    base.WndProc(ref m);
  }
}

PS:我嫌麻烦就还没去折腾实现这个拖放功能,目前只做了打开对话框选择文件。

社区反馈

同样的问题我在 Github issues 和 Stack Overflow 之类的平台也有看到很多人提出,不过看起来微软并不想解决这些问题。

相关链接:

桌面应用体验差异

Blazor Hybrid 尽管以桌面应用的形式运行,但表现更接近于网页应用。

浏览器的快捷键

一个明显的例子是,在 WebView 中按下 F5 键时,页面会像浏览器一样刷新,这种行为显然不符合传统桌面软件的用户体验。

在类似的技术中,如 Electron,也存在类似的局限。但不同的是,Electron 提供了更多对浏览器行为的控制手段,可以阻止或重定义这些行为,而 Blazor Hybrid 目前则没有这些更细粒度的控制能力。

从桌面应用的角度来看,用户希望获得一致且原生的操作体验,因此这些细微的差异可能会影响开发者对 Blazor Hybrid 应用的期望。

窗口大小调整的表现

在使用 Blazor Hybrid 时,我还注意到窗口大小调整的流畅度问题。相比起原生的桌面应用,Blazor Hybrid 的表现不尽如人意。当用户调整窗口大小时,界面偶尔会出现黑边或画面撕裂的现象。

这种问题不仅在 Blazor Hybrid 中出现,实际上,在浏览器(chrome)和 Electron 应用(QQ)中,我也观察到类似的问题。

为了更深入地理解这个现象,我还测试了 C++ 原生应用,结果发现原生应用在调整窗口大小时相对来说更流畅,没有出现黑边或撕裂的问题。

我猜测造成这种差异的原因可能在于,Blazor Hybrid 和 Electron 依赖 WebView 作为渲染引擎,而 WebView 的渲染机制在处理窗口大小调整时不如原生 UI 渲染引擎高效。

小结

Blazor Hybrid 是一个非常有潜力的技术,它让 C# 开发者能够轻松地构建跨平台桌面应用。

然而,在使用过程中,我发现了一些需要关注的问题,尤其是在拖放事件、桌面应用行为一致性和窗口大小调整表现上。

这些问题目前可能对开发者造成一定的困扰,也影响了用户体验的流畅性。

接下来我会找时间试一下 Electron 和 wails 的开发体验,进一步探索 Blazor Hybrid 在桌面软件开发中的优势。

标签:文件,桌面,处理,预料到,Hybrid,Blazor,拖放
From: https://www.cnblogs.com/deali/p/18458357

相关文章

  • PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
    前言国庆假期各种活动比较多,直到上班才有时间来更新文章~不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具QuickCutSharp加个功能,不过这个软件是基于WinForms开发的,做界面得拖拉控件,感觉繁琐又不灵活,于是索性重新做一个。原有代码是C#,于......
  • blazor得到单值或两个字段的表的方法
    linq经常生成临时表,办法如下1、得到单值 privateList<string>FeeItems;采用linq查询,例如FeeItems=_context.表.Where(x=>x.年==CurrYear).OrderBy(s=>s.ItemId).Select(s=>s.ItemId).ToList();读值:项目<InputSelect@bind-Value="SelectedItemID">......
  • Blazor开发框架Known-V2.0.13
    大家好,国庆节快乐,Known又更新了一波功能。继上个版本以来,一直在完善网站文档、KnownCMS开源项目和解决框架客户提出的一些问题。这期间客户反馈的问题主要如下:微信模板消息收不到,查其原因是网络问题,因此本版本改成后台任务发送消息无代码页面模板需要自定义无代码表单字段组......
  • [使用目前最新版]HybridCLR6.9.0+YooAsset2.2.4实现纯C# Unity热更新方案 (一)
    1.前言什么是热更新游戏或者软件更新时,无需重新下载客户端进行安装,而是在应用程序启动的情况下,在内部进行资源或者代码更新Unity目前常用热更新解决方案HybridCLR,Xlua,ILRuntime等Unity目前常用资源管理解决方案AssetBundles,Addressable,YooAsset等在这里我们采用HybridCLR......
  • 2、.Net 前端框架:Blazor - .Net宣传系列文章
    Blazor是一个使用C#和Razor语法构建Web应用程序的框架,由微软开发。它允许开发者利用.NET进行客户端Web开发,而不是依赖于JavaScript。Blazor应用程序可以运行在WebAssembly(BlazorWebAssembly)或者作为服务器端应用(BlazorServer)。Blazor的关键特性包括:......
  • Blazor开发框架Known-V2.0.11
    Known今天发布了V2.0.11版本,本次版本添加了系统WebApi在线测试,系统菜单样式配置,表格支持用户设置栏位显隐和顺序,系统上下文支持静态组件与后端交互,以及对PgSQL进行了详细的测试,修复了一些BUG,网站支持微信扫码注册登录,文档和交流互动板块也更新了一部分。Known框架的功能和文档一直......
  • 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
    数字产品护照(DPP)解决方案:利用Blazor和区块链实现产品全生命周期追踪随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据。我们的数字产品护照(DigitalProductPassport,DPP)系统正是为此而生,提供了一种安全透明的方......
  • 一套基于 Ant Design 和 Blazor 的开源企业级组件库
    前言今天大姚给大家分享一套基于AntDesign和Blazor的开源(MITLicense)、免费的企业级组件库(喜欢AntDesign风格的同学推荐使用):AntDesignBlazor。项目特性提炼自企业级中后台产品的交互语言和视觉风格。开箱即用的高质量Blazor组件,可在多种托管方式共享。支持基于WebAssembly......
  • Blazor静态服务端呈现(静态SSR)身份认证
    本文介绍Blazor静态服务端呈现(静态SSR)模式下,用户登录身份认证是如何实现的。1.SSR简介SSR是服务器侧呈现,HTML是由服务器上的ASP.NETCore运行时生成,通过网络发送到客户端,供客户端的浏览器显示。SSR分两种类型:静态SSR:服务器生成静态HTML,它不提供用户交互性或维护R......
  • blazor路径
    Blazor遵循ASP.NETCore应用对于静态资产的约定。静态资产位于项目的 webroot (wwwroot)文件夹中或是 wwwroot 文件夹下的文件夹中。使用基相对路径(/)来引用静态资产的Web根。在下面的示例中,logo.png 实际位于 {PROJECTROOT}/wwwroot/images 文件夹中。 {PR......