WPF---控件模板(一)


一、控件模板概述

控件的外觀通過一個ControlTemplate類型的對象確定,該對象指定了組成一個控件的顯示的各種視覺元素。

當WPF創建一個控件時,會創建一個控件類(模板父)的實例,然后實例化通過它的ControlTemplate設定的這個控件的外觀樹(組成這個控件的內部UI元素)。

 

二、開發自定義的簡單控件模板

為了簡單起見,我們開發一個簡單的Button控件模板。步驟參見以下:

1)在Window的Resources中定義一個名字為myButtonTemplate的控件模板

2)在使用StaticResource標記擴展為Button的Template屬性賦值

至此,一個簡單的Button的ControlTemplate就算開發好了,但是仔細看圖,我們會發現一個問題,我們按鈕實際顯示的文本信息與我們設定的文本信息是不一致的,這不是我們的預期,就連背景色和Border的顏色也不是我們的預設值,而是使用了模板的默認值,那么我們該如何修改控件模板來達到我們的預期呢?

三、控件模板之TemplateBinding

為了達到上述預期的效果,我們可以使用TemplateBinding將控件模板中的屬性綁定到控件本身(模板父)。參見以下代碼:

從圖中可以看出,現在已經達到了預期的效果。

為了達到上述同樣顯示文本的效果,我們也可以使用ContentPresenter。

四、ContentPresenter對象

1)ContentPresenter作為一個占位符,用來在模板中指定Content應該放置的位置;

2)默認情況下,ContentPresenter從模板父(應用控件模板的控件本身)獲取實際的內容,然后綁定到自己的Content屬性;

3)為了使用ContentPresenter,我們需要設置ControlTemplate的TargetType屬性為模板父的類型。

使用了ContentPresenter的ControlTemplate參見以下:

五、觸發器

1)Trigger必須在ControlTemplate.Triggers的節點下;

2)Triggers集合中可以包含任意數量的Trigger;

3)一個Trigger可以有任意數量的Setter;

4)每個Setter中指定三個屬性,分別是TargetName、Property和Value

帶有觸發器的控件模板參見以下:

當鼠標移動到按鈕上面的時候,按鈕和Border和背景色會變成模板中預設的樣式。

 

附錄:代碼

 1 <Window x:Class="ControlTemplateDemo1.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:ControlTemplateDemo1"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="350" Width="525">
 9     <Window.Resources>
10         <ControlTemplate x:Key="myButtonTemplate" TargetType="Button">
11             <Border Background="{TemplateBinding Background}" 
12                     BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderBrush}" 
13                     BorderThickness="1"  CornerRadius="3"  Name="border">
14                 <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>
15             </Border>
16             <ControlTemplate.Triggers>
17                 <Trigger Property="IsMouseOver" Value="True">
18                     <Setter Property="BorderBrush" Value="Red" TargetName="border"/>
19                     <Setter Property="Background" Value="Silver" TargetName="border"/>
20                 </Trigger>
21             </ControlTemplate.Triggers>
22                 
23         </ControlTemplate>
24     </Window.Resources>
25     <Grid>
26         <Button Content="Button" Background="Pink" BorderBrush="Green" 
27                 Template="{StaticResource myButtonTemplate}" Width="60" Height="30" >
28         </Button>
29     </Grid>
30 </Window>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM