超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Blazor Hybrid 實(shí)戰(zhàn)體驗(yàn):那些你可能沒預(yù)料到的坑

freeflydom
2025年1月17日 10:21 本文熱度 369

文件拖放事件的局限#

Blazor Hybrid 的運(yùn)行環(huán)境是 WebView,這導(dǎo)致了在處理文件拖放時(shí)出現(xiàn)了一些限制。在傳統(tǒng)桌面應(yīng)用中(如 WinForms 或 WPF),開發(fā)者可以直接捕獲拖放事件,并獲得文件的完整路徑。但在 Blazor 中,拖放事件只能像瀏覽器中一樣處理,意味著我們只能獲得上傳文件的流,而無法獲取文件的實(shí)際路徑。

這對(duì)于那些需要直接訪問文件路徑的功能(如Clipify中把視頻拖進(jìn)去處理)帶來了很大的不便。

冗余代碼(不是)#

看了項(xiàng)目代碼的同學(xué)可能會(huì)發(fā)現(xiàn),F(xiàn)ormMain.cs里還有處理拖放事件的代碼,不過實(shí)際上并沒有生效。

// 處理拖動(dòng)進(jìn)入事件,檢測(cè)是否為文件
private void blazorWebView1_DragEnter(object sender, DragEventArgs e) {
  Console.WriteLine("drag enter");
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    // 改變鼠標(biāo)圖標(biāo),表示可以拖放
    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);
    // 這里只處理單個(gè)文件,當(dāng)然你也可以處理多個(gè)文件
    if (files?.Length > 0) {
      var filePath = files[0]; // 獲取拖放的文件路徑
      MessageBox.Show($"文件路徑: {filePath}");
      // 在這里你可以將文件路徑傳遞給 Blazor 或其他處理邏輯
    }
  }
}
// 處理 DragOver 事件,防止系統(tǒng)默認(rèn)行為
private void blazorWebView1_DragOver(object sender, DragEventArgs e) {
  if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
    e.Effect = DragDropEffects.Copy; // 明確允許拖放文件
  }
  else {
    e.Effect = DragDropEffects.None;
  }
}

?解決方案

目前的解決辦法有限,根據(jù)查找到的資料和我自己的探索,有以下幾種:

  1. 在需要拖放的時(shí)候,使用一個(gè)WinForms原生控件覆蓋webview

  2. 使用hook技術(shù),攔截webview的拖放事件

  3. 重寫微軟提個(gè)的這個(gè) Blazor Webview 控件,自己實(shí)現(xiàn) WndProc 方法

第3種方法的代碼大概是這樣(未驗(yàn)證)

public class CustomBlazorWebView : BlazorWebView {
  protected override void WndProc(ref Message m) {
    const int WM_DROPFILES = 0x233; // 拖放文件消息
    if (m.Msg == WM_DROPFILES) {
      // 處理文件拖放邏輯
      // 你可以在這里調(diào)用你的拖放事件處理邏輯
      // 阻止消息傳遞,避免系統(tǒng)默認(rèn)處理文件
      return;
    }
    base.WndProc(ref m);
  }
}

PS:我嫌麻煩就還沒去折騰實(shí)現(xiàn)這個(gè)拖放功能,目前只做了打開對(duì)話框選擇文件。

社區(qū)反饋#

同樣的問題我在 Github issues 和 Stack Overflow 之類的平臺(tái)也有看到很多人提出,不過看起來微軟并不想解決這些問題。

相關(guān)鏈接:

桌面應(yīng)用體驗(yàn)差異#

Blazor Hybrid 盡管以桌面應(yīng)用的形式運(yùn)行,但表現(xiàn)更接近于網(wǎng)頁(yè)應(yīng)用。

瀏覽器的快捷鍵#

一個(gè)明顯的例子是,在 WebView 中按下 F5 鍵時(shí),頁(yè)面會(huì)像瀏覽器一樣刷新,這種行為顯然不符合傳統(tǒng)桌面軟件的用戶體驗(yàn)。

在類似的技術(shù)中,如 Electron,也存在類似的局限。但不同的是,Electron 提供了更多對(duì)瀏覽器行為的控制手段,可以阻止或重定義這些行為,而 Blazor Hybrid 目前則沒有這些更細(xì)粒度的控制能力。

從桌面應(yīng)用的角度來看,用戶希望獲得一致且原生的操作體驗(yàn),因此這些細(xì)微的差異可能會(huì)影響開發(fā)者對(duì) Blazor Hybrid 應(yīng)用的期望。

窗口大小調(diào)整的表現(xiàn)

在使用 Blazor Hybrid 時(shí),我還注意到窗口大小調(diào)整的流暢度問題。相比起原生的桌面應(yīng)用,Blazor Hybrid 的表現(xiàn)不盡如人意。當(dāng)用戶調(diào)整窗口大小時(shí),界面偶爾會(huì)出現(xiàn)黑邊或畫面撕裂的現(xiàn)象。

這種問題不僅在 Blazor Hybrid 中出現(xiàn),實(shí)際上,在瀏覽器(chrome)和 Electron 應(yīng)用(QQ)中,我也觀察到類似的問題。

為了更深入地理解這個(gè)現(xiàn)象,我還測(cè)試了 C++ 原生應(yīng)用,結(jié)果發(fā)現(xiàn)原生應(yīng)用在調(diào)整窗口大小時(shí)相對(duì)來說更流暢,沒有出現(xiàn)黑邊或撕裂的問題。

我猜測(cè)造成這種差異的原因可能在于,Blazor Hybrid 和 Electron 依賴 WebView 作為渲染引擎,而 WebView 的渲染機(jī)制在處理窗口大小調(diào)整時(shí)不如原生 UI 渲染引擎高效。

小結(jié)#

Blazor Hybrid 是一個(gè)非常有潛力的技術(shù),它讓 C# 開發(fā)者能夠輕松地構(gòu)建跨平臺(tái)桌面應(yīng)用。

然而,在使用過程中,我發(fā)現(xiàn)了一些需要關(guān)注的問題,尤其是在拖放事件、桌面應(yīng)用行為一致性和窗口大小調(diào)整表現(xiàn)上。

轉(zhuǎn)自https://www.cnblogs.com/deali/p/18458357


該文章在 2025/1/17 10:23:25 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved