數據模板就是將數據顯示的樣子進行一個改變
同理,控件模板也是將控件的樣子進行改變,下面我們來探索一下這些知識 . . .
DataTemplate
DataTemplate 常用的地方有 3 處,分別是:
ContentControl 的 ContentTemplate屬性 | 給 ContentControl 的內容穿衣服 |
---|---|
ItemsControl 的 ItemTemplate屬性 | 給 ItemsControl 的數據條目穿衣服 |
GridViewColumn 的 CellTemplate屬性 | 給GridViewColumn 單元格里的數據穿衣服 |
此文章將使用其中的 ItemTemplate進行測試 . . .
我們需要做的事情是將一組數據以柱狀圖的形式顯示出來,這組數據有:
年份、某年談了多少個女朋友
效果樣式類似於這種:
好了,接下來讓我們開始吧:
上面的這張圖上面有兩個數據,分別是 年份 與 個數
它的整體樣式是我們需要引用我們的主題 —— DataTemplate 來實現
其中我們也使用的 Binding來連接 ListBox中的 Item
- 創建DataTemplate :
<Window.Resources>
<DataTemplate x:Key="girlNum">
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding Num}"/>
<TextBlock Text="{Binding Year}"/>
</Grid>
<TextBlock Text="{Binding Num}" Margin="5,0"/>
</StackPanel>
</Grid>
</DataTemplate>
</Window.Resources>
其中發現我們需要的佈局 —— 一個矩形,兩個 TextBlock . . . 之所以把這個 DataTemplate放在 資源中是爲方便使用,增加程序的可讀性.
並且,我們使用Binding來完成 數據驅動UI的理念
- 使用 ListBox接收數據,並引用 DataTemplate:
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<ListBox x:Name="listBoxKind" ItemTemplate="{StaticResource girlNum}"/>
</Grid>
我們發現引用DataTemplate的時候,引用了一個屬性叫 ItemTemplate,開頭的時候講過 . . .
- 定義一個類,用包含一些屬性:
數量、年份
class GirlAndNum
{
public int Num { get; set; }
public string Year { get; set; }
}
- 定義一些數據,並且將這些數據賦值給 ListBox的 ItemsSource屬性:
List<GirlAndNum> list = new List<GirlAndNum>()
{
new GirlAndNum(){Num = 100, Year = "2016年"},
new GirlAndNum(){Num = 120, Year = "2017年"},
new GirlAndNum(){Num = 140, Year = "2018年"},
new GirlAndNum(){Num = 160, Year = "2019年"},
new GirlAndNum(){Num = 200, Year = "2020年"},
};
this.listBoxKind.ItemsSource = list; // itemsContorl 的屬性
-
效果圖如下:
-
總結:
我們可以看出來,DataTemplate其實並不是太難,爲數據穿上衣服而已,合理的使用 DataTemplate 會使程序變的更加漂亮 . . .
ControlTemplate
我們可以通過改變 Control的外觀來進行更加人性化的界面,比如下面:
如果我們覺得這個 TextBox的樣子是圓角矩形比較好看,那我們怎麼來實現呢?TextBox的屬性也沒有用來設計圓角矩形的 . . .
這個時候我們的 ControlTemplate就派上用處了,下面我們就來實現一下吧
我們需要的工具是 VS Blend,這個工具類似於 PS,帶有XAML的設計工具
下面讓我們來實現一下吧
- 打開 Blend,並設計我們需要的未改變之前的樣子:
-
右擊控件,點出下面的編輯模塊副本:
爲什麼不是創建空白的呢? 因爲爲我們是在原有的樣子上進行的修改 . . . -
自定義名稱,用於引用:
- 觀察已經解剖開的 TextBox控件:
我們發現,這個模塊是由兩個部分組成的:
- border
- border 嵌套的 PART_ContentHost
border 的類型爲 Border, PART_ContentHost 的類型爲 ScrollViewer.
- 添加圓角矩形的特性:
- 引用剛剛定義的 Style:
爲什麼這裏是 Style,而不是Resources呢,因爲模板的本質就是改變一些風格而已 . . .
- 效果界面:
現在這個圓角的樣子是不是更加可愛了呢 ?
我們怎麼樣才能把這個設計好的界面使用到 VS2017上面呢? 其實我需要把這個XAML 文件加入項目之中就可以了
- 加入到VS2017中:
找到包含 App.xaml 文件並且把它放到項目之中,可以替換項目本身的 App.xaml(最好不要,這種爲了方便就算了). . .
- 引用模塊,效果如圖:
- 總結:
DataTemplate 與 ControlTemplate都是爲了讓我們看起來更加的舒適而設計,使用好了之後,我們就可以無情的裝逼了 . . . 哈哈哈哈 ~~~