日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Blazor Hybrid 實戰體驗:那些你可能沒預料到的坑

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

文件拖放事件的局限#

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# 開發者能夠輕松地構建跨平臺桌面應用。

然而,在使用過程中,我發現了一些需要關注的問題,尤其是在拖放事件、桌面應用行為一致性和窗口大小調整表現上。

轉自https://www.cnblogs.com/deali/p/18458357


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

主站蜘蛛池模板: 成人欧美一区二区三区 | 亚洲欧洲淘宝天堂日本 | 亚洲精品456在线播放 | 日本免码va免费观看 | 国产福利一区二区久 | 欧美日韩亚洲国产精品自拍 | 欧美一级日 | 亚洲精品永久在线观看 | 午夜福利不卡片在线播放免费 | 伊人激情一区二区三区 | 欧美三根一起进三p | 亚洲色熟女图激情另类图区 | 成人福利在线免费观看 | 97国产在线视频公开免费 | 又粗又黄又猛又爽大片a | 国产伦子伦对白视频 | 亚洲欧美经典 | 最近免费中文字幕大全免费版视频 | 国产在线观看福利一区二区 | 2025国产精品自产拍在线观看 | 女同国产剧情在线观看 | 情趣五月天 | 国内精品视频在线播放一区 | 日本三级韩国三级三级a级按 | 久青草国产在视频青草99在 | 99re热有精品视频国产 | 日韩欧美视频一二区 | 热播影视大全 | 中文字幕亚洲综合久 | 成人性生交大片免费看一 | 视频在线观看播放免费 | 国产性tv国产精 | 欧美激情片区一区二区三区 | 五月激情综合网 | 亚洲无线码一区国产欧美国日产 | 天堂mv在线免费看 | 60分钟日韩床大片免费观 | 亚洲人午夜射精 | 日本不卡一二三区视频免费 | 专区一乛方 | 午夜视频在线免费观看 |