書名:WPF專業(yè)編程指南
作者:李應(yīng)保
出版社:電子工業(yè)出版社
出版時(shí)間:2010-01
ISBN:9787121100116
控件模板
- 在控件中使用模板
- 在資源中使用模板
- 在控件模板中使用TargetType
- 在模板中顯示控件的內(nèi)容
- 在模板中使用ContentPresenter
- 模板中元素名Name屬性
- 在模板中綁定控件的其他屬性
- 使用模板顯示電力系統(tǒng)的斷路器和刀閘開關(guān)
- 在風(fēng)格中使用模板
- 獲取WPF控件的模板
一、在控件中使用模板
在Control類中,有一個(gè)Template屬性,其類型為ControlTemplate??梢酝ㄟ^直接設(shè)置ControlTemplate,從而改變控件的視覺樹。
由于WPF控件類都是從Control類中派生出來的,因此,可以用這個(gè)技術(shù)設(shè)置所有控件的外觀。在XAML中,設(shè)置Template的語法如下:
<Control.Template>
<ControlTemplat>
….
…
</ControlTemplate>
</Control.Template>
- 讓我們來構(gòu)建按鈕的模板,用一個(gè)填充矩形來構(gòu)建按鈕的外觀,在矩形內(nèi),用一個(gè)TextBlock來顯示按鈕上的字符串:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Button HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="48" Padding="20" Height ="100" Width ="200">
<Button.Template>
<ControlTemplate >
<Rectangle RadiusX="10" RadiusY="10" Stroke="BlueViolet"
StrokeThickness="3" Name="myRectangle">
<Rectangle.Fill>
<VisualBrush Opacity="0.7">
<VisualBrush.Visual>
<TextBlock Name="myTextBlock"
Foreground="LightYellow" Background="DarkBlue"
Padding="10">模板按鈕</TextBlock>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
</ControlTemplate>
</Button.Template >
</Button>
</StackPanel>
</Page>
-
由于上面的XAML的根元素為Page,可以直接在瀏覽器中顯示該XAML。上述XAML的顯示結(jié)果如圖10-2所示:
圖10-2 模板按鈕 對(duì)于按鈕控件,還需要給模板加入一些功能,使得我們的模板和通常按鈕表現(xiàn)一樣:
當(dāng)鼠標(biāo)在按鈕控件上拖過時(shí),需要改變按鈕的顯示;
當(dāng)用戶在按鈕上按下鼠標(biāo)時(shí),按鈕需要作出相應(yīng)的反應(yīng),使用戶知道按鈕已被按下。
為此,需要在模板中加入觸發(fā)器。
<ControlTemplate.Triggers>
<Trigger Property ="UIElement.IsMouseOver" Value ="True">
<Setter TargetName="myRectangle" Property="Stroke"
Value="Green"/>
<Setter TargetName="myTextBlock" Property="Foreground"
Value="Red"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="True">
<Setter TargetName="myRectangle" Property="Stroke"
Value="LightGreen"/>
<Setter TargetName="myTextBlock" Property="Background">
<Setter.Value>
<LinearGradientBrush>
<GradientStop Offset="1" Color="DarkBlue"/>
<GradientStop Offset="0.5" Color="Blue"/>
<GradientStop Offset="0" Color="DarkBlue"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
- 在控件模板中使用觸發(fā)器和在風(fēng)格中使用觸發(fā)器的原理是一樣的,這里加入了兩個(gè)觸發(fā)器。
一個(gè)是當(dāng)IsMouseOver屬性為真時(shí),把按鈕外面的矩形框的顏色改為綠色,把按鈕的字體顏色改為紅色。
另一個(gè)是當(dāng)IsPressed屬性為真時(shí),把按鈕外面的矩形框的顏色改為淺綠色,把字符框的背景畫刷改為線性梯度畫刷。
