小技巧1 位址:http://www.cnblogs.com/ms-uap/p/4641419.html
我們在上一篇博文中展示了通過Shape.Stroke族屬性實作靜态重複性UI繪制,使得UWP界面的實作變得稍微靈活一些了。
但這一技巧還是有不少局限的,畢竟折騰StrokeDashArray屬性看上去并不是那麼直覺和适用(還存在用扇形欺騙觀衆這樣的“問題”啦)。
這一篇博文我們将為大家介紹一種更為适用,同時也更為靈活和強大的重複性UI繪制技巧。
ItemsControl是一個很常見的控件,雖然它經常是以ListView、ListBox等衍生類的形式出現,想必大家也是經常使用它們。
而ItemsControl本身,則提供了最基本的“作為對象集合”的功能。
而其中ItemsControl.ItemsSource和ItemsControl.ItemTemplate兩個屬性最為重要。前者将通過指定政策預處理的資料賦予控件,後者将源資料映射為UI元素。
靈活運用它們,就能友善的做出精準而又快速的設計。
比如:

讓我們把目光放得“短淺”一點:),此處是不是完美解決了欺騙觀衆的問題?
一個小小的問題的解決,有時能帶出新的解決方案和模式。那麼讓我們看看這段XAML有什麼作用?
首先,AngleSource是這樣一個類:
它的作用就是提供一個數列,裡面的數代表了我們要顯示的線段相對圖形中心的旋轉角度。
這個AngleSource類,以靜态資源的形式,将其含有的數列暴露給ItemsControl的ItemsSource屬性:
然後我們通過自定義ItemTemplate,将簡單的double數值具現為旋轉的圖形!
通過這種方式,我們可以使用簡單的代碼,來完成其最擅長的事,即按某種政策生成源資料。
PS:如果隻有簡單的數個元素,不使用ItemsSource+Binding也是可以的,隻要像這樣:
我們還使用ItemsControl.ItemsPanel、ItemsControl.ItemContainerStyle兩個屬性配合,讓每個線段能以表盤的中心為參考點進行旋轉:
1)ItemContainerStyle是對Item的區域進行外圍定制(Item本身交給ItemTemplate了)。
2)ItemsPanel的作用是定義元素在控件中的布局形式,預設的是StackPanel,也就是常見的ListBox和ListView的形式。
常見的還有:
整個ItemsControl的層級大緻如下:
這裡我們簡單地做兩種擴充,更多的組合期待大家的靈活運用~
這段XAML不僅按角度畫出了旋轉的線段,還在此通過一個converter對源資料進行了一次映射。是不是有點linq select的感覺?
這段XAML也是很有趣,其中的ItemsSource僅僅是提供了一個IEnumerable<int>,也就是斐波那契數列,
而我們控制Canvas.Left畫出了一系列标注線,它們距左端的位移分别是斐波那契數列的值!
或許在一些數理教學的App裡能用得上呢……
Source類同樣可以暴露出使用形如FoobarItem的IEnumerable<T>,就可以在FoobarItem中設定更多更豐富的屬性,
然後在ItemsControl.ItemTemplate(DataTemplate)進行Binding,輔以Style和Converter,實作更加豐富的效果。
這兩篇博文為大家介紹了兩種繪制重複性UI的辦法,那我們掌握這些辦法有什麼意義,或者說我們能獲得什麼好處呢?
解耦。
将這些與程式邏輯完全無關的UI設定,完全地與功能邏輯剝離開。即使需要寫一些代碼,也和功能邏輯完全沒有關聯。
讓code behind清爽,更加專注于功能的實作,而UI的變換仍舊是動态的。
精确。
由于使用XAML和原始資料生成UI,是以UI元素的屬性和位移、旋轉等變換是完全精準的,免去手工校準之虞。
并且配合CacheMode和ViewBox,使得UI在适配和渲染時表現清晰不失真,兼顧性能。
同時也提供了新的UI元素控制方式。
比如例子中的圓形進度條的實作。我們可以在背景代碼中更新StrokeDashArray來展示進度。
又比如我們設定好了ItemsControl的資料展示政策,隻需要再設定資料源,就能輕易地将其展示。
希望這兩篇部落格能夠抛磚引玉,喚來更多創意和技巧,為大家在UWP中的開發提供友善!;)