天天看點

WPF學習感受WPF的XAML好的UI類庫

WPF是微軟推出的一個先進的界面類庫,具有高度的可定制性,吸收了很多html的思想,打破了傳統的假面程式設計思路,很有創造力。

尤其是當WPF采用了XAML作為界面描述語言之後,更加簡化了WPF程式設計的難度,專門設計的Visual studio程式設計IDE對于WPF的支援更是無以複加,稱得上是絕配。

但是,學習了這麼久的WPF,給我的一個感觸就是:垃圾。

WPF這個界面類庫本身能夠實作很多種效果,确實非常難得,但是總感覺它自身就像是拼湊起來的一堆辣雞,而沒有貫穿始終的思想。讓人摸不到頭腦。

WPF的XAML

XAML本身是一種界面描述語言與WPF是兩種東西,為了簡化界面程式設計工作WPF引入了XAML,為了在XAML中更加友善的引用WPF,對于XAML本身和WPF都做了很多亂七八糟的改進。

  1. XAML中的元素屬性指派,可以采用屬性指派文法在元素标簽内指派,還可以采用成員指派辦法,在XAML标簽内部作為成員指派。這都不是靈活性的問題了,形而上學上來看,簡直是沒有一個統一的思路,過于松散想怎麼搞就怎麼搞。
  2. 屬性分為普通屬性與附加屬性,這個附加屬性表現為Grid中的元素一般都有一個Grid.Row,Grid.Colum屬性,Canvas元素中的成員一般都有Canvas.left,Canvas.Right屬性。而如果要使用代碼設定Canvas的成員位置需要使用靜态方法,Canvas.setLeft(UlElement,double),Canvas.SetRight(UIElement,double)函數。這都是不合理的。既然是在一個執行個體化的元素上設定内部執行個體化的對象的屬性,就應該采用成員文法的方式,而不是采用靜态方法啊。靜态方法特别惡心。
  3. 還有就是利用XAML聲明的方法很容易達成的效果,利用代碼來說非常困難,需要很多步驟,有時候可是很奇葩的步驟。為什麼XAML中使用起來是那麼的容易?因為微軟為了你做了大量的工作。但是如果你想利用C#代碼調用一些功能,豐富一些效果的時候,這是非常困難的,因為XAML與WPF本身是兩種完全不同的思路,你需要的是重新學習一個類庫。
  4. XAML其實就是另一種形式的C#代碼,它内部所有的标簽都會轉化為一個控件,所有的屬性都會轉化為C#語句調用,他是解釋性的,而不是描述性的。他的本質是使用了内置控件的特性完成的。也就是說它的核心還是WPF内置控件。而不是利用描述語言模拟一個控件。WPF是硬的,而HTML是軟的。從拓展性上來看,WPF不如HTML。問題是這麼一搞,C#代碼和XAML語句并不是一一對應的。因為XAML中的一個屬性可能對應着大量的WPF操作。這讓人摸不到頭腦,微軟隻是推廣XAML,是以支隊XAML做了相當多的簡單工作,卻沒有反向過來優化WPF的架構,是以很混亂。微軟推薦使用XAML的描述性文法,引入了很多模闆行為支援,但是這種支援在WPF代碼中是不存在的。

好的UI類庫

一下純屬我的個人看法,不喜勿噴。

  1. 作為一個設計良好的類庫而言,我覺得最重要的核心還是類庫的架構,最核心的其實還是軟體代碼。如果利用代碼程式設計體驗很糟糕,就說明這個類庫非常有問題。畢竟對于一個程式來說。代碼才是可拓展的一切的基礎,隻有代碼程式設計體驗良好才是真正的好類庫。
  2. 作為一個類庫開發界面設計器沒有問題,采用XML語言作為描述語言同樣沒有問題,但是XML語言與代碼一定要一一對應,這樣XML描述語言才有意義,維護起來也很友善,隻需要簡單的映射一下就可以了,不會讓人産生一種割裂感。
  3. 界面類庫應該提供最靈活的底層機制,提供給開發者最靈活的拓展手段,而且這個拓展手段一定要簡單友善,實用高效,富有哲學美感,與界面庫的設計哲學和諧統一。例如提供給開發者最基本的原子控件,友善開發者組合設計自己的專屬控件。
  4. 界面類庫一定要提供封裝好的控件,而這個封裝好的控件一定要基于界面庫的靈活的底層機制,就是利用提供給開發者的那些底層機制,這樣這些控件的呈現就是對自定義控件最好的demo。展現界面類庫強大的同時,還能友善代碼編寫。因為不是所有人都喜歡自定義控件的,有些人不在意控件,隻要能用即可。
  5. 界面庫需要提供一條簡單清晰的學習路線,而不是功能的堆積和一堆無用特性的堆積修補。例如:剛入門界面類庫,首先需要學習基本代碼調用編寫簡單界面,這個過程需要的是簡單,和諧,統一化的體驗。這之後學習XML描述檔案的編寫,XML描述檔案需要的是與代碼一一對應,這樣一來代碼知識就很容易的完成遷移。再然後,學習控件的編寫,剖析官方控件,為有需要的開發者提供一個自定義界面的手段。這樣開發者需要學習那種知識,需要學習到那種程度就非常友善了。
  6. 在XML中提供了那些便捷的工具,同樣需要在代碼程式設計的時候提供同等友善的工具。