走進WPF之控件模板


WPF不僅支持傳統的Windows Forms編程的用戶界面和用戶體驗設計,更支持使用專門的Blend進行專業設計,同時還推出了以模板為核心的新一代設計理念。在WPF中,通過引入模板,將數據和算法的“內容”和“形式”進行解耦。模板主要分為兩大類:數據模板【Data Template】和控件模板【Control Template】。本文主要以一些簡單的小例子,簡述控件模板【Control Template】的的相關內容,僅供學習分享使用,如有不足之處,還請指正。

編輯默認模板

選中控件--右鍵--編輯模板--編輯副本,打開創建Style資源對話框,如下所示:

創建Style資源,輸入資源名稱,定義位置,默認為此文檔【Window】,然后點擊【確定】,創建資源。如下所示:

創建控件元素的默認資源,如下所示:

 1 <Window x:Class="WpfApp2.TwoWindow"
 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:WpfApp2"
 7         mc:Ignorable="d"
 8         Title="TwoWindow" Height="350" Width="800">
 9     <Window.Resources>
10         <Style x:Key="FocusVisual">
11             <Setter Property="Control.Template">
12                 <Setter.Value>
13                     <ControlTemplate>
14                         <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
15                     </ControlTemplate>
16                 </Setter.Value>
17             </Setter>
18         </Style>
19         <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
20         <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
21         <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
22         <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
23         <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
24         <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
25         <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
26         <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
27         <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
28         <Style x:Key="OneButtonStyle" TargetType="{x:Type Button}">
29             <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
30             <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
31             <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
32             <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
33             <Setter Property="BorderThickness" Value="1"/>
34             <Setter Property="HorizontalContentAlignment" Value="Center"/>
35             <Setter Property="VerticalContentAlignment" Value="Center"/>
36             <Setter Property="Padding" Value="1"/>
37             <Setter Property="Template">
38                 <Setter.Value>
39                     <ControlTemplate TargetType="{x:Type Button}">
40                         <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
41                             <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
42                         </Border>
43                         <ControlTemplate.Triggers>
44                             <Trigger Property="IsDefaulted" Value="true">
45                                 <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
46                             </Trigger>
47                             <Trigger Property="IsMouseOver" Value="true">
48                                 <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
49                                 <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
50                             </Trigger>
51                             <Trigger Property="IsPressed" Value="true">
52                                 <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
53                                 <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
54                             </Trigger>
55                             <Trigger Property="IsEnabled" Value="false">
56                                 <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
57                                 <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
58                                 <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
59                             </Trigger>
60                         </ControlTemplate.Triggers>
61                     </ControlTemplate>
62                 </Setter.Value>
63             </Setter>
64         </Style>
65     </Window.Resources>
66     <Grid>
67         <Button x:Name="one" Content="Hello wpf" Margin="5" Width="100" Height="30" Style="{DynamicResource OneButtonStyle}"></Button>
68     </Grid>
69 </Window>

編輯默認模板,也可以通過【文檔大綱】右鍵--編輯模板--編輯副本,然后打開創建資源對話框,進行操作,如下所示:

 

 

修改默認樣式

通過默認創建的控件模板Style,可以修改和重定義控件的顯示內容,如:設置按鈕顯示圓角,和鼠標放上去為紅色。

 

要實現以上功能,只需要修改兩個地方即可,如下所示:

 

 自定義控件模板

通過自定義模板,同樣能達到修改控件樣式的效果。

控件模板也是資源的一種,每一個控件模板都有一個唯一的key,在控件上通過Template進行綁定,如下所示:

 1 <Window x:Class="WpfApp2.ThreeWindow"
 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:WpfApp2"
 7         mc:Ignorable="d"
 8         Title="自定義控件模板示例" Height="150" Width="300">
 9     <Window.Resources>
10         <ControlTemplate x:Key="oneStyle" TargetType="Button">
11             <Border Background="LightBlue" CornerRadius="5" x:Name="border">
12                 <StackPanel Orientation="Horizontal" HorizontalAlignment="{TemplateBinding HorizontalAlignment}">
13                     <TextBlock VerticalAlignment="{TemplateBinding VerticalAlignment}">》》</TextBlock>
14                     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}"></ContentPresenter>
15                 </StackPanel>
16             </Border>
17             <ControlTemplate.Triggers>
18                 <Trigger Property="IsMouseOver" Value="true">
19                     <Setter Property="Background" TargetName="border" Value="Red"/>
20                     <Setter Property="BorderBrush" TargetName="border" Value="Blue"/>
21                 </Trigger>
22             </ControlTemplate.Triggers>
23         </ControlTemplate>
24     </Window.Resources>
25     <Grid>
26         <Button x:Name="one" Content="Hello wpf" Margin="5" Width="100" Height="30" VerticalAlignment="Center"  HorizontalAlignment="Center" Template="{StaticResource oneStyle}"></Button>
27     </Grid>
28 </Window>

自定義控件模板,示例如下:

 備注

控件模板決定了數據的展示形式和用戶體檢,在軟件UI設計中非常重要,本文旨在拋磚引玉,共同學習,一起進步。

無題·昨夜星辰昨夜風

【作者】李商隱  【朝代】唐

昨夜星辰昨夜風,畫樓西畔桂堂東。身無彩鳳雙飛翼,心有靈犀一點通。

隔座送鈎春酒暖,分曹射覆蠟燈紅。嗟余聽應官去,走馬蘭台類轉蓬。

 

 


免責聲明!

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



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