2009-12-16 67 views
25

現在是爲我的項目編寫GUI的時候了,我想知道使用哪種技術。我在.NET 1 & 2中完成了大部分.NET GUI開發,所以我知道Windows Forms合理。我隱約知道WPF,但還沒有試圖「進入它」。Windows窗體是否是舊技術?

Windows窗體是死的還是臨死? WPF是一個很好的學習技術嗎?它是未來,僅僅是一個階段,還是與Windows Forms並行的技術?

此外,任何經驗都會很好聽,特別是那些廣泛使用的人。你是如何在兩個框架中找到類似的功能的?

回答

43

WinForms死了還是臨死?

號它不顯著進一步發展(即沒有新的重大增加),但它在.NET 4中完全支持,例如。

WPF是一種很好的學習技術嗎?

是的。

未來,只是一個階段,還是可以與WinForms並行的技術?

它的目的是最終轉移到WPF,但也可以理解,在WinForms中有大量現有的代碼庫,並且在WPF中沒有重寫它們的商業案例。因此WinForms仍然受支持。

此外,任何經驗都會很好聽,特別是那些廣泛使用的人。你是如何在兩個框架中找到類似的功能的?

從廣義上講,WPF更富有表現力。如果您將框架視爲可以以各種方式組合在一起的樂高積木,WinForms積木要大得多 - 每個積木都做了很多 - 因此將它們放在一起的方法更少。很多時候,當你需要一些東西 - 但不是很像現有的磚塊時,你必須從頭開始編寫自己的東西。在WPF中,磚塊明顯更小,並且可以以許多有趣甚至令人驚訝的方式進行組合。

有關具體示例,請考慮WPF Button是如何容納任意內容的容器 - 不僅僅是WinForms中的圖像+文本,還包括任何其他WPF控件或控件組。

與WinForms相比,WPF也更容易編寫動態佈局。後者也有佈局,但問題在於它們是在視覺設計器中使用的皇家PITA,並且通過代碼編寫WinForms組件初始化非常繁瑣。使用WPF,您只需手工編寫XAML標記,並且佈局(通常是控件樹)非常自然地以XML表示。

部分源於上述,我發現WPF更容易本地化。首先,這是因爲您確實需要動態佈局才能實現本地化(因爲您事先並不知道所有語言環境中字符串的長度)。對此,WinForms解決方案不僅考慮文本標籤,而且還考慮位置和大小,將其作爲「本地化屬性」 - 因此,如果翻譯者發現字符串不適合,則應該自行重新排列窗體上的控件。在WPF中,動態佈局是默認方法,所以本地化只是處理字符串。

WPF綁定框架相當強大(即使詳細,由於缺乏內聯轉換器),並大力推動MVP,並在一般情況下,模型/視圖分離。這可以通過2.0以上的WinForms來實現,我也試圖在那裏做到這一點,但它更乏味,特別是在空處理方面,有時可能是rather buggy

一個特別的問題是WinForms設計器與源代碼控件的交互方式。這裏有兩個類似的問題。首先,設計師將編輯後的表格作爲代碼序列化,並且有時候佈局的微小變化可以使設計者生成完全不同的代碼(如果編輯工具欄,這種代碼會特別明顯),因爲它會混淆代碼行 - 即實際上它改變了單行屬性值,但它也重新排序所有內容。這導致了歷史上非常多的噪音(幾乎不可能分辨出差異時究竟發生了什麼變化),但更重要的是,這意味着合併這些文件是一件非常頭疼的事情。這通常發生在兩個人同時使用同一表單工作時,然後一個人提交他的更改,另一個人嘗試提交,發現文件在此期間發生了更改,嘗試合併,查看差異,並跳出最近的窗口。

當您使用WinForms可本地化的表單時,會將某些屬性推送到資源文件,這時會出現一個非常類似的問題。同樣,設計人員非常喜歡在資源文件中對屬性值進行重新排序,以便進行任何微小的更改,並具有與前面所述相同的所有問題。

現在就WPF的不足之處。其中最主要的一點是它比較複雜,對於只有WinForms,VCL,VB或其他類似「傳統」框架經驗的人才會感到陌生。另一個問題是,在我看來,文檔並不完美 - 它通常給出一個體面的概述,但很少涉及角落案例,其中一些可能非常重要。對於WinForms也是如此,但是那裏可能的組合更少,角落案例也更少。

還有第三方組件的問題。 WinForms現在已經存在了很長一段時間,並且有很多可用的,並且它們中的很多都非常成熟。 WPF相對比較年輕,仍然在經歷增長的困境,大多數第三方解決方案也是如此。

WPF中的一個特別的寵物是它反諷文本的方式 - 與大多數人使用普通的Windows ClearType相比,它被認爲質量差得多,特別是在小字號的情況下;有關更多信息,請參見this bug report。這已經在WPF 4中得到了解決,但那還沒有發佈,即使它將會發布,也有可能你會想要堅持一段時間的3.5 SP1,並且修復程序沒有被反向移植。

+2

謝謝!這是完美的答案,正是我所尋找的信息。我喜歡你的lego-brick比喻。我試圖忽略WPF,但這裏的評論讓我相信是時候開始學習了。 – DanDan 2009-12-16 18:41:05

+7

作爲一個便箋,給定MS技術成熟的一個好兆頭是MS本身是否使用該技術。在撰寫本文時,有一種主要的MS產品獨佔使用WPF - Expression Blend,以及一種即將使用大量WPF的主要產品,並且僅將其用於任何新的UI,將WinForms和本機Win32留給少數遺留位 - VS2010。除此之外,這意味着任何對這些產品有負面影響的WPF缺陷都將受到很多關注。我知道有相當多的WPF的.NET 4修復,因爲VS2010使用它:) – 2009-12-16 18:54:53

+0

VS2010在WPF中編碼,它顯示了它與2008年相比的樣子,但上次我測試它時,並有難看的顏色:) – 2009-12-18 14:39:55

1

當然不是。

Winforms更易於使用(考慮到您還不知道WPF),而WPF與Winforms模型完全不同。

如果你想要一個簡單的GUI(標準形式的東西)去Winforms。如果你想要更華麗一些,並有時間,去WPF。

我相信未來WPF將成爲事實標準。但是現在,如果我想要快速而乾淨的東西,我堅持使用Winforms。

值得一提的是,很多應用程序已經在使用Winforms,這意味着維護工作通常會涉及WinForms,所以請不要直接將它關閉。

+0

謝謝 - 這是我沒有束縛但相當簡單的項目,所以這可能是開始走向WPF之路的理想機會。 – DanDan 2009-12-16 18:27:07

+0

請注意,如果你堅持正確地做事並嚴格分離模型和視圖(例如通過應用MVP),那麼「標準GUI」在WPF中可能仍然更容易實現。 – 2009-12-16 18:35:05

+0

無論你使用什麼,MVP(或WPF的MVVP變體)都是解耦代碼的必備工具。 – Finglas 2009-12-16 18:43:49

10

WinForms沒有死或死...他們只是不能提供WPF可以(沒有很多工作)的相同的用戶體驗。他們只是老技術。

WPF是一個很好的學習技術。它提供了以更少的工作提供更豐富的用戶體驗的能力。

使用WPF的模型肯定不同於WinForms。我用兩個(的WinForms更重比WPF/Silverlight的項目)和對我來說最困難的過渡是:

  1. XAML,如果你有像MXML另一種標記語言經驗,這是不是那麼糟糕。

  2. 數據綁定

  3. 接口事件處理(鼠標懸停效果,時間表等)

+0

從這裏的評論我知道,WPF不只是另一種WinForms,它給出的不僅僅是這些。看起來很值得花點時間! – DanDan 2009-12-16 18:23:06

3

的WinForms還遠遠沒有死/死亡。 WPF只是一種更新的方法來解決UI,因爲它促進了WinForms中更加困難的事情。諸如將用戶界面背後的模型與實際用戶界面分開以便輕鬆進行測試是一個很重要的因素。

這絕對值得學習,但一定要學習創建屏幕的「WPF方式」,而不是僅僅適合你的WinForms方式。這是一種不同的編碼方式。

+0

感謝您的信息。你有沒有學習「WPF方式」的好鏈接/書籍建議? – DanDan 2009-12-16 18:24:16

+1

@DanDan - 我見過的最好的免費在線資源是WPF博士的網站http://drwpf.com/blog/。通過嗨ItemsControl A-Z!對我來說最好的書,雖然它也是最古老的書之一,但是亞當·納丹的「三明治」發佈了WPF。 HTH – Berryl 2009-12-16 18:30:29

+0

@Berryl - 一個很好的鏈接,很好找! – DanDan 2009-12-16 18:45:45

1

WinForms並未死亡。谷歌「winforms C#作業」,你會發現很多。 WPF是最熱門的東西,但它還是比較新的。對於另外兩到三年的恕我直言,這不會是主流。

+0

但它看起來會成爲主流?所以我遲早都會去學習它,看起來好像:) – DanDan 2009-12-16 18:25:12

+2

呆在桌面/厚客戶端空間足夠長的時間,是的,你一定要學習WPF。 – 2009-12-16 18:29:05

2

WinForms可能會在企業環境中存在很長時間。他們在很多方面工作得很好。許多項目都基於WinForms,許多公司將在項目期間堅持使用該技術,而不是混合搭配。

話雖如此,WPF是未來。這是一個更高效,更強大的UI技術,非常值得學習。

WinForms和WPF可以在一個應用程序中共存。這可能是將他們引入公司的最常見方式(即小概念驗證項目)。

+0

這裏的一般協議似乎是WPF將成爲未來,並且是.NET開發人員的關鍵工具。感謝您的意見! – DanDan 2009-12-16 18:28:22

1

關於WinForms和WPF,下面是一個很好的blog post。總體思路是明智地選擇,這意味着沒有一個人勝過另一個人。每個都有不同的功能子集。

做出WPF和WinForms之間的決定然而是另一回事。當然,WPF是新的熱點,WinForms已經老掉了,但它是正確的選擇嗎?顯然,這取決於這種情況,微軟正在繼續提供並支持WinForms,因此它不會很快消失。那麼選擇WPF而不是WinForms有哪些令人信服的因素? Karl在他的WPF業務應用系列中提到了WPF選擇WinForms的選擇,但其中的原因可能是微妙的。

我個人比較喜歡WPF,因爲我是以Web開發人員身份開始的,發現標記XAML更自然。

+0

謝謝,偉大的文章。 – DanDan 2009-12-16 18:20:26

1

我認爲在WPF變得更加主流之前,肯定值得學習WPF,提高你的技術水平總是很好,並且對新技術的經驗和知識總是有利的,特別是如果WPF將來會被更廣泛地使用。另外,儘管編寫xaml標記與創建表單有很大的不同,但它不是距離編寫html有一百萬英里的地方,如果您已經完成了任何web開發,可能不會對您有太大偏離。

儘管WinForms是一種舊技術,但並不意味着它將永遠消失,但我們仍然有應用程序在工作中使用VB6編寫。我們的開發部門中只有一半人使用.NET工作 - 我們分成3個團隊,一個團隊仍在使用.NET 1.1,另一個團隊使用.NET 2,我所在的團隊使用.NET 3.5(可以說我們是幸運的!)

+0

我正在學習WPF的過程。也許我最終會對.NET 3.5技術產生興趣......可能在.NET 4.0出來之前! – DanDan 2009-12-18 16:35:11

+0

更好的開始!你總是可以嘗試從.NET 2直接跳到4.0,但是從現在3.5開始,你現在就可以開始學習了,而不是等到有更多的時間才能開始學習:-) – TabbyCool 2009-12-18 16:39:45

1

我們開始使用WPF做一個新項目,坦率地說,很難回到WinForms。許多整潔的東西,我不能跟你一起了。

雖然一個建議的話。即使你可以用WPF做更復雜的佈局(比如它提到的,一個按鈕或幾乎任何東西,可以託管其他東西,如圖像,文本框甚至更多),在WinForm中發現的一些其他「基礎」東西很難重現。 示例:在WPF工具包推出之前,WPF沒有數據網格和日期時間選擇器,因此您必須自己動手。此外,它還沒有MaskTextBox,你必須自己做或從第三方下載它。最後一個我遇到了,我實際上發現註解與Treeview:樹葉和父母之間的界線不顯示。

這就是說,在大多數方面還是比WinForm好得多。

+0

我只花了幾個日子在上面,它吸引着我。我不知道是什麼花了我很長的時間纔去冒險。 – DanDan 2009-12-18 16:36:50

1

我們開始使用WPF在一個新的項目,我們有

新的應用程序包括的WinForms大量的遺留代碼。

只要我們想使用winforms的舊對話框,它是可能的。

當你使用WPF時,你並不想回到winforms。在GUI中做這些事情會讓你花費大量時間在WinForms上更容易。

任何需要一些時間來學習東西,並能夠使用它的所有能力(不僅僅是UI,還有數據綁定和命令模式)的任何方式。

有經驗的somone可以幫助第一架構可以是非常有用的。自2016年

+0

我有一本好書和堆棧溢出來幫我:) – DanDan 2009-12-20 13:06:57

+0

沒問題。它只是減少進度風險。 祝你好運:) – tal 2009-12-20 13:54:21

2

透視:

我不經常插話主張在這個老問題,而是想到了一個尾聲可能是在這一個適當的。爲什麼?因爲即使現在(2016年),我也聽到企業環境中的開發人員仍在問這個問題。

是的,七年後,WinForms在企業環境中仍然活着,並且仍然受到Microsoft的支持。 Google Trends自2005年中以來表現出緩慢而穩定的利息下滑,目前的利息約爲2005年的三分之一。

WPF在2009年的時候大打出手,但從未完全接管新UI開發的事實標準。谷歌趨勢顯示WPF利率從2009年到2011年達到峯值,然後下降得比WinForms快。目前的搜索興趣大約是2011年的一半,但仍然接近WinForms當前搜索興趣的兩倍。

那麼開發人員現在使用什麼?基於網絡的用戶界面已經開始流行,主要是由於移動瀏覽的興起。你可以爭論寫出一個Web UI的最佳方式(AngularJS + WebAPI?ASP.NET MVC?React?在Google Trends中所有內容都趨於向上)。無論您使用哪種技術,都很難否認一次編寫(響應式)用戶界面的吸引力,並使其適用於所有設備和平臺。雲託管服務通過提供幾乎即時/無限的擴展以及低廉的前期基礎設施投資,進一步推動了網絡的發展。

因此,今天,我衷心推薦使用Web UI,因爲它可能會延長您的應用程序的保質期 - 這往往需要在企業環境中持續很長時間。或者,如果你是一位開發移動開發的微軟開發人員,Xamarin值得一看。

+1

是的 - 完全同意。如果我現在正在製作一個寵物項目,那麼我會使用WinForms,因爲它非常簡單。作爲第一個想法,任何更復雜,更持久的應用都應該基於Web UI。任何需要桌面電源/安全性(這不是一大塊程序)的東西現在應該可以看看跨平臺,所以像QT這樣的東西。我不打擾WPF - 網絡技術更加活躍。 – DanDan 2016-06-14 09:55:19