WPF 的設計思想先進都體現在哪些方面?

很多人都說 WPF 設計非常先進,那麼為什麼說 WPF 的設計很先進?


關於WPF我談以下感想:希望對你有幫助!

一、與WPF結緣

第一次接觸WPF是在2012年。學習了WinForm編程之後,了解到WPF這個非常先進的UI框架。可惜當時未能一探究竟,直到今天。

5年過去了,WPF沒像想像中大紅大紫,反而略顯沉寂。也許是微軟的統治地位不保,也許是桌面端編程淡出了人們的視線。總之,這項打算引領未來十年Windows平台GUI開發的先進技術,似乎始終沒能推廣開來。時至今日,大部分Windows平台的開發者仍然使用WinForm編程,因為WPF給人難用、性能差的的負面印象,即使有著炫酷的效果和先進的編程思想,也無濟於事。

不過最近恰好遇到一個WPF項目,正可趁此機會深入了解一下WPF。畢竟耳聽為虛,眼見為實,親自嘗試才知道它的好與壞。遂買了一本劉鐵猛著的《深入淺出WPF》,花幾天時間讀了一遍。起初興緻勃勃,每一處都想追根究底,到了後面發現WPF的確很複雜,讀一遍根本不能完全理解,必須動手實踐,才有可能體會其中的精髓。所以本文簡單談談我對WPF的初印象,算作第一次學習WPF的一些理解和體會。

二、為什麼用WPF

Windows GUI開發從過去的MFC到WinForm,再到今天的WPF,每一次改變都帶來了技術和思想上的巨大革新。記得當年大一的時候,有一門課還專門講MFC編程,MFC尚且老當益壯。現在還有誰會用MFC做Windows開發呢,除非是給自己找不痛快。就像上一次技術升級一樣,這次從WinForm到WPF的變革也需要經歷很長的過程。雖然WinForm看起來已經很好用了,但在新的思想和新的技術蓬勃發展的今天,WinForm已經難以勝任軟體開發的需求,主要體現在這兩個方面:

  • UI和邏輯代碼嚴重耦合
  • 沒有專業的UI設計平台

其中第一條是WinForm最致命的缺陷,採用事件響應機制,無可避免地難以做到View層和Controller層分離,也就無法真正實現MVC架構。而WPF採用數據綁定(Data Binding)解決了這個問題,這種數據驅動的思想後來被廣泛應用於Web開發,比如AngularJS、Vue.js等等。基於數據綁定,WPF用路由事件代替了WinForm的事件系統,增加了命令系統,增加了功能強大的控制項模板和數據模板,以及方便的繪圖和動畫介面。

第二條缺陷導致了WinForm無法製作出精美的界面,更沒有炫酷的效果。相比之下,WPF在這方面做的非常到位,提供了專門設計界面的Blend軟體,設計師用Blend畫出界面,自動生成XAML代碼,從而與程序員後端代碼無縫對接。

可以說,WPF在設計理念上比WinForm前進了一大步。下面對其中的幾個特性做簡單的介紹。

三、XAML語言

與WinForm完全使用C#編寫布局代碼不同(雖然這些代碼是自動生成的),WPF使用了一種全新的標記語言XAML(讀作zaml)來描述界面布局。它的語法類似於XML,但卻有著與HTML+CSS+JavaScript等同的強大能力,而且有Blend這麼好用的可視化編輯器,簡直是Windows程序員的福音。

就像JSP會被編譯為Servlet一樣,XAML也會被編譯成C#代碼,並與程序員編寫的後端代碼合併成為完整的類。因而與XAML窗體對應的後端代碼類名前會加上partial關鍵字,這是C#靈活性的體現。

XAML其實與C#類庫有著密切的聯繫。比如XAML中的標籤就是C#中的類,標籤中的x:Name屬性就是C#類的實例,標籤中的其它屬性都是C#類的屬性等等。標籤的嵌套關係構成了一棵樹,稱為Logical Tree,這是與WinForm界面截然不同的結構。WinForm的界面控制項不具有嵌套關係,各自獨立,因而一旦需要關聯起來就要編寫大量的邏輯代碼。而具有樹狀關係的控制項之間發生聯繫時消息可以很自然地沿著樹結構傳遞,簡化了邏輯代碼,同時體現出數據驅動的理念。

在UI布局方面,如果體驗過Qt的QML布局,可以發現XAML與它很相似。這類布局方式思路清晰,嵌套關係明確,設計出的布局適應性強。相比之下, HTML布局總讓我很頭疼,難以設計出想要的效果。

XAML的樣式(Style)提供了類似CSS的效果。可以為一類控制項設置統一的樣式。再配合上模板(Template),無需創建自定義控制項就可以獲得各種各樣的效果。

WPF還提供了豐富的繪圖和動畫效果,這已經遠遠超出了WinForm所能提供的功能。

四、綁定(Binding)

綁定的概念現在已經深入人心,沒有綁定何來數據驅動呢。在WPF中,把控制項顯示的內容與數據源綁定後,就能實現數據的雙向傳輸,也就是說,數據源中數據的變化會直接體現在界面上,界面上用戶對數據的修改也會直接反映到數據源中。這一功能的直接好處就是省略了兩個事件處理方法,一個是數據源數據更改事件,另一個是控制項的數據更改事件。別小看這兩處節約,大部分的界面邏輯代碼都花在這樣的事情上。比如讓文本框的數字跟隨進度條變化,檢驗輸入的用戶名是否滿足格式要求,將實體類的成員顯示在表單中等等。有了數據綁定,就可以減少大量的邏輯代碼,只需要在XAML中簡單地加上綁定依賴即可。

綁定的源可以是各種各樣的類型,比如對象、列表、http://ADO.NET對象、XML、LINQ檢索結果等等。數據在綁定的源和目標之間傳輸的時候,可以添加數據校驗和數據轉換,從而實現各種各樣的需求。

五、路由事件

WPF中的事件稱為路由事件。與WinForm中的事件不同的是,路由事件並不直接指定接收者,而是沿著界面元素樹Logical Tree從下往上傳播。每經過一個結點就檢查該結點是否聲明了事件處理器,如果有則處理,否則繼續向上傳播。這樣做的好處是事件觸發者和事件接收者完全解耦,事件接收者甚至不知道事件是從哪裡發出的,它只關心自己需要處理哪一類事件就可以了,而不必關心事件從哪裡來。

WPF受人詬病的性能問題,我猜就和路由事件這類特性有關。由於事件的發送者和接收者完全解耦,在模塊分離的同時也造成了資源浪費,許多不必接收該事件的結點也會收到該事件,它們只能檢查後放行,讓事件繼續向上尋找下一個接收者。直觀上看,這顯然會耗費更多的時間。看來任何事情都有兩面性,過於降低耦合卻造成了性能損失,兩者不可兼得。


粗略點說,一個看起來漂亮的wpf程序,比起一個丑的,他的testability和maintainability都更好,這就是一個設計的好的框架的威力,讓那些不喜歡好好跑自動化測試的人用的很彆扭。

這些東西具體體現在各種圍繞著mvvm構建出來的功能上。要是dependency property可以是C#的語法的話,那就完美了。


要說先進的話,還是剛出來時先進,現在都被學去了,而且以js的靈活性,在mvvm方面已經做的比wpf好多了。

xaml本來就是學的html的一點東西,能比以往的gui更容易的換主題,但是論強類型xaml強,論靈活性還是html強多了。

但是wpf由於IDE的統一完善(就VS嘛),開發還是最方便的

風口確實已經到web和移動端了,但是有些領域還是需要桌面的,也確實沒有啥新的桌面GUI出來,所以真正的桌面端也就玩玩.net系和qt了。

當然會有提electron的。我說的真正的桌面端如果要做成web的話,是會有很多麻煩的,許可權不足,需要各種瀏覽器的插件,可能需要花大價錢來買這些插件之類的事情,用electron也是有麻煩的,而且基於chrome的東西性能也確實會差很多,在渣渣機子上會很卡,所以真正的桌面端還是需要的。

我這裡wpf和.net core的服務端還是主要路線,主要產品,web端手機端也都是基於.net core的服務端做的,我們都在做,但是我們行業人手不夠,只有wpf這種穩定方便的才能作為主要界面工具。


有人在輪子哥的回答下提出了寫質疑

我要回復的是, wpf這十幾年,不比web端穩定多多多多多多了? 人家gtk123,qt12345 quick qml,wpf有分版本么?

office沒用wpf可能有別的理由,但是wpf能不能做office,你可以看telerik的demo啊,有個類word demo還是蠻完善的,從ribbon界面到富文本間的各種功能,看過這個就能肯定wpf一定能做word,這還不夠么?

其他的他下面都有人回了


WPF 在它誕生的 2006 年非常先進,那還是 Windows 桌面應用的輝煌年代,別說 Chrome,連 IE7 都沒有發布。那時諾基亞還是手機老大,谷歌還沒退出中國,禿布斯的蘋果還在憋大招,被微軟按著打。

醒醒,現在馬上就 2020 年了,WPF 里諸如 XAML、數據綁定、事件系統等的閃光點已經傳承到了現在的 Web 系技術棧上。去看看一線大公司里的 GUI 開發者們在維護什麼框架吧——React、Vue、Flutter,沒一個是把 Windows PC 當作主戰場的。風口在哪,最頂尖的開發者們就會流入造什麼領域的輪子。WPF 背後經典 PC 桌面應用的風口顯然已經過了。我相信下一代的 GUI 生產力應用風口,一定是基於開放、跨平台、低門檻的 Web 混合式技術棧的(注意我說的是廣義的 Web 技術棧,不只是 Electron 這種套殼技術)。基於這樣的技術棧,普通的 Web 前端工程師也能開發工業級生產力 GUI 應用,並移植到龍芯這樣的國產 CPU 上運行,這光是想想就很讓人期待了。

從 1984 年的 Macintosh 開始,GUI 領域裡的模仿、借鑒和創新就從來沒有停止過。你當然可以說現在流行的 Web 框架抄了 WPF,但別忘了微軟的 GUI 抄了蘋果,蘋果的 GUI 又抄了施樂。一門發布時思想或工程技術上領先的技術,很快就會被借鑒、模仿、改進,從而衍生或啟發出新一代的產品,完成自己的歷史使命。從這個角度上來說,WPF 已經很了不起了。

科技進步的過程里,那些不斷湧現出來的先進新技術,都不過是時代潮流里的一朵朵小浪花。我們自己又何嘗不是這樣呢?

當然了,以上所有技術,應該都不如鴻蒙的全場景分散式技術棧。沸騰!


WPF先進之處就體現在影響了一個時代!!!

大名鼎鼎的就是MVVM設計模式,在當時Winform的輝煌時代,改變了大家對桌面應用開發的思維方式,從事件驅動轉換為數據驅動,之後被借鑒到其他技術領域,特別是現在的大前端技術,所以如果學習WPF就不能存有Winform的傳統設計思維

另外了解了MVVM模式後,對現今流行的前端框架簡直手到擒來。


WPF -&> Knockout -&> Angular -&> Vue ,追隨者說明 MVVM 確實優秀,分離了關注點減少了UI與業務邏輯的耦合性,缺點也有複雜的業務屬性泛濫很難排查業務流向。


有了webassambly ,siverlight 會不會重生


其實吧,有wine就可以了,

一點都不卡,真的

我來晒晒桌面

頂多加上matlab,nx,cadance什麼的


推薦閱讀:

要開發一個倉庫管理軟體,應該選擇c#(winform/wpf)還是c++(qt)?
wpf求教導,用數據綁定,slider 和 3個radiobutton 相互聯動?

TAG:圖形用戶界面 | Windows開發 | WindowsPresentationFoundationWPF | NET開發 |