Skip to content
January 30, 2011 / windperson

WPF的七不思議

 

  1. WPF要做一件UI相關的事,光是實作的位置,最起碼就有兩種方法(XAML宣告和Code-Behind);所以不少東西會有N種方法可以〝看起來〞能達到,但不保證一定會有完美解法,往往需要『想~』和日後更進一步做其他相關需求下去時,才知道哪種方法不會產生你不想碰到的side effect。
  2. 在XAML裡Color不能直接單獨宣告成resource使用,請用筆刷當共用的資源,即使下x:Shared=False,在某些情況下還是會造成render出的UI畫面是整個空的或漆黑一片,再不然就是直接一跑就程式當掉。
  3. 在需要做一堆資料的列表時,很不直覺且違背Google搜尋統計結果地,在自訂性來看,DataGridListView好用(但是DataGrid卻不能設定每行高度,ListView卻可以)。千萬別相信那些For Dummy的入門級書籍,那種只塞資料不改樣式時做什麼都很簡單啦~等到要開始『刻鋼板』,才發現ListView看起來越直覺、越簡單可以改的屬性和效果,越難改,調到最後都沒幾個可以直接調整的屬性,都要開大刀,建立一堆自定義Template和相搭配的Style,明明一件理論上只要一兩個屬性配合就可以搞定的很簡單事情,弄到最後全部都是自定義的Template,事倍功半。 為什麼WPF當初的概念是data和presentation的logic分開,但是,卻沒個類似修飾html tag的css這種概念的功能,結果,往往.xaml檔在開發過程中,持續地修修改改,改到最後,檔案內容前後上下裡外充斥著到處亂開的<ooxx.resource>…幾十幾百行…</ooxx.resource>區塊,塞滿不知道到底是為了甚麼而搞的自訂template和亂參照的style,以及亂合併還重複合併的resource dictionary,再加上一堆XML的註解(這是唯一可以提供某段XAML code是幹嘛用的明文提示),整個就亂七八糟,日後的維護光想到就頭大。
  4. 某些UI的屬性設定會在不同作業系統(NT kernel 5.1的Windows XP、2003和kernel 6.x的Windows Vista、7、2008 )上產生不同的呈現結果,原因當然是因為底層的實作不同而導致的,嫌疑犯們想當然爾就是一些直覺想就需要顯示卡提供的效果才能有功能的,例如Viewbox;可是,連ListView這種東西都能出包,真是被打敗了!!所以,當一堆UI控制項複合著兜起來又要在不同系統上都能跑時,請抱持著寫網頁時解"browser issue"的心態和技巧來抓蟲,Snoop是你最可靠的朋友(也還好有這個類似Firebug的tool),而Visual Studio 2010的內建WPF Tree Visualizer,老實說,只能看不能改,還要在程式被debugger break的暫停狀態才能叫出來,真是沒啥屁用。
  5. 不要太相信IDE,Visual Studio不能過濾掉所有的XAML語法錯誤,而等到執行時才會ㄘㄨㄚˋ的東西,不是Visual Studio吐個XamlParseException 之後就僵死在那裏只能用工作管理員砍掉,再不然就是程式一跑馬上就產生Windows錯誤回報視窗給你看,連是甚麼錯誤或Exception的hint都看不到,通常以上這兩種都是.xaml的內容有錯,請詳細檢查所有的.xaml,看是否有指到不存在的style或template,data binding的markup extension語法寫錯有時候也會造成死當;但是先前也有一次VS一跑debug mode就當掉的原因,其實是project的.cs檔裡寫的converter class的access權限有錯。
  6. 上一個不思議情況的相反,有些時候在Visual Studio裡顯示是錯誤的(例如它說要合併的.xaml資源檔不存在之類的),可是實際上是可以跑的;像stackoverflow網站上這個在data converter裡使用.xaml檔裡宣告的resource方法,VS在Xaml Editor會顯示錯誤,但實際上是可以compile並且正常執行的。
  7. WPF只是個UI的殼,所以,很多跟data有關的事情,沒用data binding,或搞個MVVM架構的design pattern,亦或用自定義的型別物件來稿,會發現能使用的方法和東西都很少,千萬別再以寫window form的想法說直接用後面資料庫抓來的data table塞進前端的UI控制項元件了,有些場合會發現居然連排序都不行。(可能是因為M$的feature list還沒輪到,也可能是因為用錯角度去寫解決方法了)

結論:customizability和productivity永遠是天秤的兩端。Beauty is only skin deep,但是,美麗是需要付出代價的。

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: