我對 WPF 動搖時的選擇:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目錄

NET Framework 4.6.2的最大亮點

為什么固守462不升級

WPF-開發體驗的巔峰

為什么對WPF動搖了

基于Islands+UWP的濾鏡嘗試

總結


NET Framework 4.6.2的最大亮點

安全性能大提升:

默認啟用TLS1.2協議,更安全,它為后續的版本提供了重要的安全支撐,是微軟在網絡安全方面的重要里程碑

一般現代的瀏覽器和服務器都優先使用TLS1.2,這也是嵌入webview2的重要基礎。

兼容性增強 :

更好的windows10支持(非常重要,對更好地使用win10的UI特性提供了可能)


為什么固守462不升級

多年的Windows窗口程序的開發經驗,使用的 .NET Framework版本 ,從2.0,到3.5,到4.0,到4.5.1,到4.6.2 ,雖然微軟一直在提倡 6.0,8.0,甚至9.0,現在已經推出了 10.0,它們擁有更好的特性和性能,但是我個人使用最多的其實是4.0~4.6,在大量的企業項目的實踐中,4.0表現出了絕對的兼容性和穩定性的優勢,尤其是在兼容性上。因為每次進行微小的框架升級后,都可能在某個特別的場景中遇到靈異事件,這種埋雷很讓人頭疼,所以在較長的周期來看,從依賴的硬件接口、對各類sdk的兼容、用戶的安裝環境 等各方面考慮,徘徊在新舊的框架之間,既想使用新的特性,又擔心穩定性和兼容性受到影響。綜合考慮,當前主要在使用4.6.2。


WPF-開發體驗的巔峰

接觸Winform/Asp.net/WPF/UWP/Winui3/HTML開發,在這些體驗中,WPF絕對是開發體驗最優,且難以被超越的一種前端框架,WPF可用的免費UI庫也非常豐富:

Modern UI 框架:

HelixToolkit.Wpf 框架:

XamlFlair 框架:

XAML可讀性極強,數據雙向綁定,豐富的矢量圖形支持、多種多樣的動畫系統、完全自定義的UI外觀(真的太自由了)、任意的ui元素(包括視頻)對外部著色器的支持也僅僅是簡單的幾句代碼就搞定、任意的UI元素可以以任意的路徑裁切展示(UWP和WinUI3實現相同功能極其復雜,甚至很難支持)且方式簡單、各種路徑形式的透明過渡使用起來也極其輕松(比如透明羽化,OpacityMask輕松解決,但是UWP甚至無法直接支持)、透明窗口的使用方式和兼容性也極強(幾乎沒看到過在哪里黑窗口的情況,但是WINUI3要繞一大圈才能實現,而且對不同的Windows系統版本的兼容性也不同),因此,當習慣了WPF開發以后, 再去適應其他的UI框架, 會感覺到處是坑。


為什么對WPF動搖了

這里提到的“動搖”是有條件的:如果對于偏功能性的企業級的應用,WPF 絕對是極佳的選擇, 但是當應用偏向于交互和展示的時候,希望給用戶以更好的UI操作體驗的時候,WPF的動畫幀率就嚴重的不能滿足視覺需求了.

?WPF 動畫效果:

UWP + CompositionApi 動畫效果:

(上面2個演示,為了極致的表現出2個動畫的差異,我使用了佳能相機對電腦屏幕以?60FPS 錄制了視頻, 視頻原文件在文末的附件中)

從上面的示例可以看到, 假設讓一張全屏的圖片 從右側 切入到主屏來顯示, WPF會有一種大步邁進的、咯噔咯噔的感覺(我覺得很像是汽車在過減速帶的感覺),這種感覺顯得很吃力、不優雅,無法表達出 “輕松拿捏的高級感”,這個時候,就會動搖:選擇WPF是否是一個正確的選擇呢? 可是如果升級更高的框架來適應其他的UI框架的話,有可能在硬件的對接、系統的兼容性上,在實施部署階段遇到問題的可能性極大,在這種條件下,采取了方案:保留了基于.NET Framework 4.6.2的業務處理, 以及部分功能性的管理頁面,而對于側重用戶交互的流程部分, 通過Islands嵌入的方式來使用 UWP的功能,類似于WindowsFormsHost嵌入Winform控件,這里通過XamlHost 嵌入UWP控件,通過這種方式 在進行 比較大量的圖片列表滾動的時候,視覺效果差異極大。

UWP在使用的時候幾乎不用去擔心內存管理,使用很隨心,并且極流暢,WPF 在進行對象管理的時候, 尤其是大量對象、大量圖片的管理上,極容易讓內存持續飆高,這對于即使有經驗的開發者來說,進行有效的管理也是一件不容易的事(這種場景下,我驗證多種方式來看,最輕松有效的方式是使用弱對象管理 WeakRefrense,根據使用效果看,目前基本沒有遇到弊端)。


基于Islands+UWP的濾鏡嘗試

WPF實現濾鏡是相當簡單的一件事,并且對任意UI元素有效,包括視頻:

但是當前Islands+UWP這種嵌入方式, 其實對UWP本身的功能進行了很多限制,而且UWP本身就是基于 沙盒機制,雖然很安全,但是很多效果無法使用,因此,當我們要實現一個多種多樣的濾鏡功能的時候,與WPF比起來, 是相當困難的一件事。

其實在采取 WPF+Islands+UWP 這個方案之前我嘗試過:

嘗試 1:.net6.0 +wpf+嵌入winui3 = >但是wpf本身基于directx9, 但是winui3基于directx11,12 , 它們可能有渲染上有資源競爭或沖突,導致嵌入后總是莫名其妙地突然崩潰退出;

嘗試 2:.net6.0 +winform+嵌入winui3 = >可行。Winform本身是gdi+的渲染機制, 與winui3的directx11,12不沖突 ,可以成功嵌入,但是沒有深入研究這種嵌入狀態的其他組件的健壯性, 該組合屬于不上不下的狀態。

嘗試 3:.net8.0+純winui3=>可行,而且配合ai很輕松地寫出了幾十種濾鏡,但是在 這種組合下,我去嘗試使用 透明窗口和 元素的異形裁切的時候,遇到了很多坑,遠沒有想象的順利。所以雖然這種方案具有極好的性能,但是它表現出來的問題,以及它復雜的使用方式,讓我對遷移到跨度這么大的框架,并沒有信心和把握。

嘗試 4:.net 4.6.2+webview2=>這與當前的框架選擇差異是比較大的, 它是偏web化的一種實現方式, Web具有非常好的開發生態, 而且這種組合表現出了良好的渲染性能 ;但是我在實際驗證的時候也遇到了一些問題,比如在對接工業相機的時候,對于實時幀的顯示,性能是極差的, 而且這個遷移的差異太大,工作量極大。但是它極強的 渲染能力和極佳的開發生態,對我有非常大的吸引力,我后續可能會考慮。

以上的 4 種嘗試,都讓我對框架的升級沒有信心,它們目前的穩定性或成熟度,也對我沒有足夠的吸引力,因此暫時先保留了當前的4.6.2+ Islands+UWP的使用方式

UWP 的這種 Islands 嵌入的方式使我對著色器的使用并不能特別的自由,因此只能使用純cpu的 濾鏡算法,但是這不適合實時視頻幀的應用 :

上圖是我在另一篇文章中實現的濾鏡效果:

https://blog.csdn.net/LateFrames/article/details/150536630?spm=1001.2014.3001.5501


總結

如果想要安全的、具有極豐富的可擴展性、并且高效率的開發,那么 WPF 無疑是絕對的最佳的選擇 ;如果在舊項目 需要進行遷移, 但是考慮到綜合硬件原因, 不能對框架升級太多的時候,但是又對 UI?的體驗有進一步的要求, 這時候可以考慮嵌入?Islands 方式來使用 UWP 組件, 它就像在 WPF 中嵌入了一個 WinForm 組件? WindowsFormsHost?的感覺 ,但是這種方式的局限性也非常大, 很難使用著色器, 開發體驗也比較差, 這種嵌入的方式無法可視化編輯,這一點在效率上來說很低,?但是 UWP+CompositionApi 的動畫流暢性太棒了,這是 WPF 如何都無法達到的流暢幀率 。

WPF動畫與UWP動畫比對的相機錄制視頻的原文件,可以更清晰地看到視覺效果的差異,附件:

WPF:https://download.csdn.net/download/LateFrames/91949307

UWP:https://download.csdn.net/download/LateFrames/91949310

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97845.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97845.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot大文件下載失敗解決方案

SpringBoot大文件下載失敗解決方案 后端以文件流方式給前端接收下載文件,文件過大時出現下載失敗的情況或者打開后提示文件損壞,實際是字節未完全讀取寫入。 針對大文件下載失敗的情況,以下是詳細的解決方案: 大文件下載失敗的主要原因 內存溢出:一次性加載大文件到內存…

torch.gather

torch.gather 介紹 torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor 沿由 dim 指定的軸收集值。 對于三維張量,輸出按如下方式確定: out[i][j][k] input[index[i][j][k]][j][k] # 如果 dim 0 out[i][j][k] input[i][i…

Golang | http/server Gin框架簡述

http/server http指的是Golang中的net/http包,這里用的是1.23.10。 概覽 http包的作用文檔里寫的很簡明:Package http provides HTTP client and server implementations. 主要是提供http的客戶端和服務端,也就是能作為客戶端發http請求&a…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(三)

Experiment 上來的一段話就概括了整章的內容。 We evaluate the representation learning capabilities of ResNet, Vision Transformer (ViT), and the hybrid. 章節的一開頭就說明了,對比的模型就是 ResNet,CNN領域中的代碼模型。 ViT。 上一篇中提到的Hybrid模型,也就是…

5-12 WPS JS宏 Range數組規范性測試

Range()數組是JS宏中不缺少的組成部分,了解Range()數組的特性必不可少,下面我們一起測試一下各種Range()數組。 1.Range()數組特性 單元格區域:Range("a2:m2")與Range("a2","m2")的類型都是:Range/Object,功能都為單元格區域,功能…

uniapp微信小程序保存海報到手機相冊canvas

在uniapp中實現微信小程序保存海報到手機相冊,主要涉及Canvas繪制和圖片保存。以下是關鍵步驟和代碼示例: 一、關鍵代碼展示: 1. 模板配置:頁面展示該海報,可直接查看,也可下載保存到手機相冊,h…

glib2-2.62.5-7.ky10.x86_64.rpm怎么安裝?Kylin Linux RPM包安裝詳細步驟

一、準備工作 ?確認系統版本? 這個包是 ky10的(也就是 openEuler 20.03 LTS SP3 或類似版本),而且是 ?x86_64 架構(就是常見的64位電腦)?。 你要先確認你的系統是不是這個版本,不然可能裝不上或者出問題…

webrtc之語音活動下——VAD人聲判定原理以及源碼詳解

文章目錄前言一、高斯混合模型介紹1.高斯模型舉例1)定義2)舉例說明2.高斯混合模型(GMM)1)定義2)舉例說明3)一維曲線二、VAD高斯混合模型1.模型訓練介紹1)訓練方法2)訓練結果2.噪聲高斯模型分布1…

【Redis】-- 主從復制

文章目錄1. 主從復制1.1 主從復制是怎么個事🤔1.2 拓撲結構1.2.1 一主一從拓撲1.2.2 一主多從拓撲1.2.3 樹形拓撲1.3 主從復制原理1.3.1 復制過程1.3.2 數據同步PSYNC1.3.2.1 replicationid/replid (復制id)1.3.2.2 復制偏移量維護1.3.3 psync運行流程1.3.4 全量復制…

開源炸場!阿里通義千問Qwen3-Next發布:80B參數僅激活3B,訓練成本降90%,長文本吞吐提升10倍?

開源炸場!阿里通義千問Qwen3-Next發布:80B參數僅激活3B,訓練成本降90%,長文本吞吐提升10倍? 開源世界迎來震撼突破! 通義千問團隊最新發布的Qwen3-Next架構,以其獨創的"小而精"設計理念&#x…

【C++入門】C++基礎

目錄 1. 命名空間 1.1 命名空間的創建和使用 2. 輸入輸出 2.1 輸出 2.2 輸入 3. 缺省參數 3.1 全缺省 3.2 半缺省 4.函數重載 4.1 為什么C支持重載而C語言不支持? 4.1.2 編譯的四個過程 4.2 extern是什么 5.引用 5.1 引用的特性 5.1.1 引用的“隱式類…

如何往mp4視頻添加封面圖和獲取封面圖?

前言:大家好,之前有給大家分享過mp4錄像的方案,今天給大家分享的內容是:如何在添加自定義的封面圖到mp4里面去,以及在進入回放mp4視頻列表的時候,怎么獲取mp4視頻里面的封面圖,當然這個獲取到的…

你的第一個Transformer模型:從零實現并訓練一個迷你ChatBot

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,注冊即送-H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 引言:破除神秘感,擁抱核心思想 …

【20期】滬深指數《實時交易數據》免費獲取股票數據API:PythonJava等5種語言調用實例演示與接口API文檔說明

? 隨著量化投資在金融市場的快速發展,高質量數據源已成為量化研究的核心基礎設施。本文將系統介紹股票量化分析中的數據獲取解決方案,涵蓋實時行情、歷史數據及基本面信息等關鍵數據類型。 本文將重點演示這些接口在以下技術棧中的實現: P…

RabbitMQ如何保障消息的可靠性

文章目錄什么是消息可靠性?RabbitMQ消息可靠性的三個維度1. 生產者到Exchange的可靠性2. Exchange到Queue的可靠性3. Queue到消費者的可靠性核心機制詳解Publisher Confirm機制消息持久化Mandatory參數消費者確認機制(ACK)最佳實踐建議1. 合理…

二十、DevOps落地:Jenkins基礎入門(一)

二十、DevOps落地:Jenkins基礎入門(一) 文章目錄二十、DevOps落地:Jenkins基礎入門(一)1、DevOps初識1.1 什么是DevOps1.2 DevOps相關工具鏈1.3 什么是CICD?1.4 持續集成CI介紹1.5 持續交付和持…

簡單易實現的數據校驗方法Checksum

簡單易實現的數據校驗方法Checksum 在數據傳輸中,Checksum(校驗和) 扮演著 “數據完整性哨兵” 的角色。它的主要作用是 快速檢測數據在傳輸過程中是否發生了錯誤 。 下面我將詳細解釋它的作用、工作原理、優缺點以及典型應用。 核心作用&…

再次深入學習深度學習|花書筆記1

我已經兩年沒有碰過深度學習了,寫此文記錄學習過程,加深理解。 深度學習再次深入學習深度學習|花書筆記1信息論第四節 數值計算中的問題上溢出 和 下溢出病態條件優化法再次深入學習深度學習|花書筆記1 這本書說的太繁瑣了,如果是想要基于這…

DeerFlow實踐:華為LTC流程的評審智能體設計

目錄 一、機制設計核心邏輯 二、4 個評審點智能體機制詳解 (一)立項決策(ATI)智能體機制 1. 知識調用與匹配 2. 評審校驗流程 3. 異常處理 (二)投標決策(ATB)智能體機制 1. …

C++與Lua交互:從原理到實踐指南

核心原理:Lua虛擬棧機制 C與Lua能夠高效交互的核心在于Lua虛擬棧的設計,這是一個精巧的中立通信區,解決了兩種語言間的本質差異:特性對比CLua語言類型靜態編譯型動態解釋型數據管理明確內存布局虛擬機統一管理類型系統編譯時確定運…