一、獲取預設的控制項模板 WPF修改控制項模板是修改外觀最方便的方式,但是會出現不知道原來的控制項的模板長什麼樣,或者想用來參考的,下麵分享一下獲取某控制項預設控制項模板的方式(已Button為例): 1、創建一個Button 2、在界面上選擇Button,右鍵->編輯模板->編輯副本 ,即可看到XAML中自 ...
一、獲取預設的控制項模板
WPF修改控制項模板是修改外觀最方便的方式,但是會出現不知道原來的控制項的模板長什麼樣,或者想用來參考的,下麵分享一下獲取某控制項預設控制項模板的方式(已Button為例):
1、創建一個Button
2、在界面上選擇Button,右鍵->編輯模板->編輯副本 ,即可看到XAML中自動生成了原始的控制項模板
3、可以在預設模板上修改其中的一些屬性運行測試是否生效
這樣在預設的控制項模板上編輯,只修改需要修改的部分即可,可以大大減少工作量,也添加了容錯率。但是會發現所有的模板和樣式都放在主界面的XAML代碼量會很多、很亂,所以可以採用單獨的資源詞典來存放這些模板和樣式,主界面只要根據Key調用即可。
二、資源字典的使用
1、選中項目右鍵->添加->新建項->資源詞典(WPF)
生成的初始資源詞典如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TemplateDemo"> </ResourceDictionary>
現在可以在內容將模板和樣式作為資源分流到各個資源詞典,現在將Button的預設模板轉移至該控制項模板
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TemplateDemo"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <Style x:Key="FocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/> <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/> <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/> <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/> <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/> <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/> <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/> <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/> <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/> <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/> <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/> <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Padding" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <StackPanel> <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Border> </StackPanel> <ControlTemplate.Triggers> <Trigger Property="IsDefaulted" Value="true"> <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/> <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/> </Trigger> <Trigger Property="IsPressed" Value="true"> <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/> <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/> <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/> <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
2、要引用該資源字典還需要在App.Xaml中進行聲明,我的名稱叫TemplateDictionary.xaml,需要保證其命名空間一致
<Application.Resources> <ResourceDictionary Source="TemplateDictionary.xaml"></ResourceDictionary> </Application.Resources>
3、在主XAML中使用StaticResource或DynamicResource進行靜態或動態引用即可
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="309,286,0,0" VerticalAlignment="Top" Width="75" Style="{StaticResource ButtonStyle1}"/>
以上就是關於獲取預設空間模板和使用資源詞典的一些簡單的介紹,結合起來使用可以搭建簡潔方便的代碼佈局