天天看點

UWP開發入門(十一)——Attached Property的簡單應用

  UWP中的Attached Property即附加屬性,在實際開發中是很常見的,比如Grid.Row:

   Grid.Row這個屬性并不是Button對象本身的執行個體方法,而是定義在Grid類型上的static property,實際使用時卻又附在其他控件的XAML裡。

  我們今天不讨論如何使用UWP中已經定義好的Attached Property(使用起來很簡單,沒啥好講的),也不會介紹附件屬性的定義,以及與.NET屬性的差別(MSDN文檔非常詳細),更不會花大力氣去分析附加屬性背後的原理(這個有大牛珠玉在前,不敢造次)。

  本篇僅以極簡單的例子來展示Attached Propery的應用場景,抛磚引玉以期共同學習提高。

  設想場景如下,需要根據文本内容,将電話号碼和郵箱位址以下劃線藍色字型和普通文本區分開來:

  

UWP開發入門(十一)——Attached Property的簡單應用

  顯示文本UWP中一般是通過TextBlock來實作,一段文字中如果需要不同顔色,以及增加下劃線就需要在TextBlock的Inlines屬性中添加不同的Inline的子類對象(比如Run,Underline等)。

  而修改TextBlock的Inlines集合需要直接操作TextBlock對象,UWP的程式又通常是MVVM結構,在ViewModel中不應添加對View層級的引用,這就要求不能在ViewModel中通路TextBlock。

  那麼修改TextBlock的邏輯就隻能放在View中,問題是最終傳回的TextBlock需要根據運作時具體綁定的文本内容才能确定,要求同時能通路TextBlock以及綁定的DataContext。似乎也不适合寫在Page.xaml.cs中。

  Attached Propery則非常完美的解決了我們的問題,首先附加屬性支援binding,這就将View中的TextBlock和ViewModel中的文本内容結合在一起;其次附加屬性是View層級的概念,通過它來修改TextBlock不會破壞MVVM的結構。

  接下來我們動手定義一個Attached Property:

  這個附加屬性叫做RichTextProperty,我們給他做了GetRichText和SetRichText兩個方法的封裝,以便我們能像經典的.NET屬性一樣,通過“RichText”來通路。具體的細節請參考MSDN的文檔,這裡我們着重看一下RegisterAttached方法中傳遞了一個回調方法RichTextChanged。

  該方法是一個靜态方法,在biding的對象發生改變時觸發,并将biding的對象本身作為第一個參數傳遞進來。該方法的代碼先判斷了綁定的新值是否為空,不為空則調用CreateTextBlock方法,根據inputString來建立帶有藍色下劃線的TextBlock。

  通過正規表達式比對phone和email,将比對的内容通過AddUnderline方法添加到原TextBlock中,不比對的内容則直接AddText。

  實際的開發中,這裡可能存在更複雜的邏輯,比如即時通訊程式中存在@的概念,下劃線的内容需要在點選後做相應處理等(打電話,發郵件)。本篇中的代碼為了簡單清晰做了最簡化的處理,各位在自己的APP裡可以進一步發揮想象補充,隻要别讓手機或電腦爆炸就行……

  本篇有心回歸開發入門的初心,介紹的内容較為簡單,寫得不好還請包涵。

  照例放出GayHub位址: