WPF自定义控件与样式(15)-终结篇 & 系列文章索引 & 源码共享

系列文章目录   

WPF自定义控件与样式(1)-矢量字体图标(iconfont)

WPF自定义控件与样式(2)-自定义按钮FButton

WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式

WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展

WPF自定义控件与样式(6)-ScrollViewer与ListBox自定义样式

WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

WPF自定义控件与样式(10)-进度控件ProcessBar自定义样 

WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

WPF自定义控件与样式(13)-自定义窗体Window & 自适应内容大小消息框MessageBox

WPF自定义控件与样式(14)-轻量MVVM模式实践 

WPF自定义控件与样式(15)-终结篇

源代码下载地址:http://files.cnblogs.com/files/anding/Util.Controls.zip

Github项目地址:https://github.com/kwonganding/wpf.controls

一.总结.声明

  关于本WPF,本人也只能算是一个刚入门的,在学习中和工作中,学习、借鉴了很多网友的文章和开源的项目的知识。发现提供实际项目开发需要的基础控件、样式的文章大都比较散,不成系列。因此基于现在项目中使用的基础UI库,写了这个系列,希望对有需要的人有所帮助。

  本系列包括本文共15篇,就到此为止了。关于一些问题再次说明一下:

  • 每一篇文章中都给出了基本所有主要代码,目的仅供参考学习,由于目前还是公司在使用中的项目,因此不便提供完整项目源码,有需要的同学还是多动动手吧!
  • 对于确实需要源码参考学的,推荐开源项目MahApps.Metro(http://mahapps.com/),我在那里面学习借鉴了很多,本系列中不少样式中都有她(就是她)的影子。
  • 本文会把一些额外遗漏的资源或代码一并提供出来

二.附录.本系列补充资源

2.1附加属性

  很多样式中使用了附加属性来对基础控件扩展,ControlAttachProperty.cs所有代码:  

View Code

  其中有一个比较好玩的附加属性就是AllowsAnimationProperty,实现旋转动画的支持,类型为bool,可以有很多种使用方式,如绑定到普通控件的IsMouseOver上,当鼠标悬浮就旋转180度,移开又转回去,效果(gif录制的问题,看上去没有那么流程):

 

  也可以绑定到CheckBox、RadioButton、ToggleButton的IsChecked属性上。

            <TextBlock Text="" Style="{StaticResource FIcon}" Margin="3" FontSize="40" core:ControlAttachProperty.AllowsAnimation="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}">TextBlock> <core:FImage Margin="3" Width="30" Height="30" Source="Images/qq.png" 
core:ControlAttachProperty.AllowsAnimation="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}">core:FImage>

2.2扩展方法

  静态扩展类ControlExtession.cs代码:  

View Code

2.3配色资源Colors.xaml

  本系列前面文章中,基本所有样式中都没有直接使用具体色彩,而是通过资源的方式配置的,这些配色资源都在Colors.xaml中。这样的设计理论上可以实现换肤,在不同客户端中也很容易定制自己需要的风格色彩搭配。 Colors.xaml代码: 

复制代码
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  <SolidColorBrush x:Key="WindowBackground" Color="#093B5D">SolidColorBrush> <SolidColorBrush x:Key="WindowInnerBackground" Color="Transparent">SolidColorBrush>  <SolidColorBrush x:Key="WindowBorderBrush" Color="#920892">SolidColorBrush> <DropShadowEffect x:Key="WindowDropShadow" Color="#F472F4" BlurRadius="8" ShadowDepth="0" Direction="0" Opacity="0.7" /> <SolidColorBrush x:Key="CaptionForeground" Color="White">SolidColorBrush>  <ImageBrush x:Key="CaptionBackground" ImageSource="pack://application:,,,/XLY.Framework.WPFTest;component/Images/back/b2.jpg" Opacity="1" Viewport="0,0,202,143" ViewportUnits="Absolute" TileMode="Tile" AlignmentX="Left" AlignmentY="Top"/>  <SolidColorBrush x:Key="InfoForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="QuestionForeground" Color="#74B80C">SolidColorBrush> <SolidColorBrush x:Key="WarningForeground" Color="DarkOrange">SolidColorBrush> <SolidColorBrush x:Key="ErrorForeground" Color="#E74E4E">SolidColorBrush>  <SolidColorBrush x:Key="WaitingBoxBackground" Color="#921692">SolidColorBrush>  <DropShadowEffect x:Key="DefaultDropShadow" Color="Black" BlurRadius="5" ShadowDepth="2" Direction="315" Opacity="0.6" />  <SolidColorBrush x:Key="TextForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="TextBackground" Color="#0D234B">SolidColorBrush> <SolidColorBrush x:Key="TextSelectionBrush" Color="#8F8787">SolidColorBrush>  <SolidColorBrush x:Key="TextLabelBackground" Color="#508AB6">SolidColorBrush>  <SolidColorBrush x:Key="ControlBorderBrush" Color="#999C9F">SolidColorBrush> <SolidColorBrush x:Key="MouseOverBorderBrush" Color="#F6D1D1">SolidColorBrush> <SolidColorBrush x:Key="FocusBackground" Color="#365080">SolidColorBrush> <SolidColorBrush x:Key="FocusBorderBrush" Color="#EBCECE">SolidColorBrush>  <SolidColorBrush x:Key="ScrollBarForeround" Color="#877F7F">SolidColorBrush> <SolidColorBrush x:Key="ScrollBarBackground" Color="#3E3E42">SolidColorBrush>  <sys:Double x:Key="HeaderFontSize">14sys:Double> <SolidColorBrush x:Key="HeaderBorderBrush" Color="#A6FFA500">SolidColorBrush> <SolidColorBrush x:Key="HeaderBackground" Color="#0A48D3">SolidColorBrush> <SolidColorBrush x:Key="ItemsContentBackground" Color="#1389D7">SolidColorBrush> <SolidColorBrush x:Key="ItemsAlternationContentBackground" Color="#128EE0">SolidColorBrush> <SolidColorBrush x:Key="GridLinesBrush" Color="#A6D0C2A7">SolidColorBrush> <SolidColorBrush x:Key="ItemSelectedForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="ItemSelectedBackground" Color="#A145F8">SolidColorBrush> <SolidColorBrush x:Key="ItemMouseOverBackground" Color="#BA7DF4">SolidColorBrush> <SolidColorBrush x:Key="ItemMouseOverForeground" Color="White">SolidColorBrush>  <SolidColorBrush x:Key="ItemHighlighteBackground" Color="Blue">SolidColorBrush> <SolidColorBrush x:Key="ItemHighlighteForeground" Color="White">SolidColorBrush>  <SolidColorBrush x:Key="CheckedForeground" Color="#F7B63E">SolidColorBrush> <SolidColorBrush x:Key="MouseOverForeground" Color="Orange">SolidColorBrush> <SolidColorBrush x:Key="PressedForeground" Color="DarkOrange">SolidColorBrush> <SolidColorBrush x:Key="LinkForeground" Color="#0816BB">SolidColorBrush>  <SolidColorBrush x:Key="PopupBackground" Color="#066EB3">SolidColorBrush>  <SolidColorBrush x:Key="ButtonBackground" Color="#1D4A9A">SolidColorBrush> <SolidColorBrush x:Key="ButtonForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="ButtonMouseOverBackground" Color="Orange">SolidColorBrush> <SolidColorBrush x:Key="ButtonMouseOverForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="ButtonPressedBackground" Color="DarkOrange">SolidColorBrush> <SolidColorBrush x:Key="ButtonPressedForeground" Color="White">SolidColorBrush>  <SolidColorBrush x:Key="MenuForeground" Color="#920892">SolidColorBrush> <SolidColorBrush x:Key="MenuBackground" Color="#DDD1D1">SolidColorBrush> <SolidColorBrush x:Key="MenuBorderBrush" Color="DarkBlue">SolidColorBrush> <SolidColorBrush x:Key="MenuMouseOverBackground" Color="#0D3CD2">SolidColorBrush> <SolidColorBrush x:Key="MenuMouseOverForeground" Color="White">SolidColorBrush> <SolidColorBrush x:Key="MenuPressedBackground" Color="#082CA0">SolidColorBrush> <SolidColorBrush x:Key="MenuPressedForeground" Color="White">SolidColorBrush>  <SolidColorBrush x:Key="SuccessfulfaiBrush" Color="#16B32A">SolidColorBrush> <SolidColorBrush x:Key="FailedBrush" Color="#B92222">SolidColorBrush> <FontFamily x:Key="FontFamily" >Microsoft YaHeiFontFamily> <sys:Double x:Key="FontSize">13sys:Double> <sys:Double x:Key="DisableOpacity">0.5sys:Double> <sys:Double x:Key="ReadonlyOpacity">0.88sys:Double> <sys:Double x:Key="WatermarkOpacity">0.4sys:Double> <sys:String x:Key="DateFormat">yyyy年MM月dd日sys:String> <sys:String x:Key="DateTimeFormat">yyyy-MM-dd HH:mm:sssys:String> ResourceDictionary>
复制代码

2.4转换器

  BackgroundToForegroundConverter.cs代码:  

复制代码
    /// 
    /// 根据背景色获取前景色。当然也可反着用
    ///  public class BackgroundToForegroundConverter : IValueConverter { private Color IdealTextColor(Color bg) { const int nThreshold = 105; var bgDelta = System.Convert.ToInt32((bg.R * 0.299) + (bg.G * 0.587) + (bg.B * 0.114)); var foreColor = (255 - bgDelta < nThreshold) ? Colors.Black : Colors.White; return foreColor; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is SolidColorBrush) { var idealForegroundColor = this.IdealTextColor(((SolidColorBrush)value).Color); var foreGroundBrush = new SolidColorBrush(idealForegroundColor); foreGroundBrush.Freeze(); return foreGroundBrush; } return Brushes.White; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; } }
复制代码

  PercentToAngleConverter.cs代码:  

复制代码
    /// 
    /// 百分比转换为角度值
    ///  public class PercentToAngleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var percent = value.ToSafeString().ToDouble(); if (percent >= 1) return 360.0D; return percent * 360; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
复制代码

  ThicknessToDoubleConverter.cs代码:  

复制代码
    /// 
    /// 获取Thickness固定值double
    ///  public class ThicknessToDoubleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var thickness = (Thickness)value; return thickness.Left; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; } }
复制代码

  TreeViewMarginConverter.cs代码:  

复制代码
   /// 
    /// 计算树节点的左缩进位置
    ///  public class TreeViewMarginConverter : IValueConverter { public double Length { get; set; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var item = value as TreeViewItem; if (item == null) return new Thickness(0); int dep = this.GetDepth(item); return new Thickness(Length * dep, 0, 0, 0); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; } public int GetDepth(TreeViewItem item) { TreeViewItem parent; while ((parent = GetParent(item)) != null) { return GetDepth(parent) + 1; } return 0; } private TreeViewItem GetParent(TreeViewItem item) { var parent = item != null ? VisualTreeHelper.GetParent(item) : null; while (parent != null && !(parent is TreeViewItem || parent is TreeView)) { parent = VisualTreeHelper.GetParent(parent); } return parent as TreeViewItem; } }
复制代码

  TrueToFalseConverter.cs代码:  

复制代码
    /// 
    /// 这是一个颠倒黑白的世界
    ///  public sealed class TrueToFalseConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var v = (bool)value; return !v; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
复制代码

  为了使用简单,对常用的转换器定义了静态变量的引用:  

复制代码
    /// 
    /// 常用转换器的静态引用
    /// 使用实例:Converter={x:Static local:XConverter.TrueToFalseConverter} ///  public sealed class XConverter { public static BooleanToVisibilityConverter BooleanToVisibilityConverter { get { return Singleton.GetInstance(); } } public static TrueToFalseConverter TrueToFalseConverter { get { return Singleton.GetInstance(); } } public static ThicknessToDoubleConverter ThicknessToDoubleConverter { get { return Singleton.GetInstance(); } } public static BackgroundToForegroundConverter BackgroundToForegroundConverter { get { return Singleton.GetInstance(); } } public static TreeViewMarginConverter TreeViewMarginConverter { get { return Singleton.GetInstance(); } } public static PercentToAngleConverter PercentToAngleConverter { get { return Singleton.GetInstance(); } } }
复制代码

  然后使用时就不用在xaml中声明资源了,通过静态引用的方式使用,就是这样的: 

EndAngle="{TemplateBinding Value, Converter={x:Static local:XConverter.PercentToAngleConverter}}"

 2.6其他样式

  Share.xaml:  

复制代码
    
       <Style TargetType="{x:Type ToggleButton}" x:Key="ComboToggleButton"> <Setter Property="Foreground" Value="{StaticResource TextForeground}" /> <Setter Property="local:ControlAttachProperty.FIconSize" Value="18"/> <Setter Property="local:ControlAttachProperty.FIconMargin" Value="0,1,3,1"/> <Setter Property="local:ControlAttachProperty.FIcon" Value=""/> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid x:Name="Grid"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> Grid.ColumnDefinitions> <Border Background="{TemplateBinding Background}" x:Name="Bg" Grid.ColumnSpan="2" Margin="0,1,1,1" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Opacity="0.3"/> <TextBlock Grid.Column="1" x:Name="FIcon" FontSize="{Binding Path=(local:ControlAttachProperty.FIconSize),RelativeSource={RelativeSource TemplatedParent}}" Text="{TemplateBinding local:ControlAttachProperty.FIcon}" local:ControlAttachProperty.AllowsAnimation="{TemplateBinding IsChecked}" Foreground="{TemplateBinding Foreground}" Style="{StaticResource FIcon}" Margin="{TemplateBinding local:ControlAttachProperty.FIconMargin}"/> Grid>  <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="{StaticResource MouseOverForeground}" /> <Setter Property="Opacity" TargetName="Bg" Value="0.55" /> Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> <Setter Property="Opacity" TargetName="Bg" Value="0.6" /> Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> <Setter Property="Opacity" TargetName="Bg" Value="0.6" /> Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Opacity" Value="{StaticResource DisableOpacity}" TargetName="Grid"/> Trigger> ControlTemplate.Triggers> ControlTemplate> Setter.Value> Setter> Style>  <Style TargetType="{x:Type TextBox}" x:Key="EditableTextBoxStyle"> <Setter Property="Margin" Value="1"/> <Setter Property="Padding" Value="0"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="{x:Null}"/> <Setter Property="MaxLength" Value="2048"/> <Setter Property="Foreground" Value="{StaticResource TextForeground}"/> <Setter Property="ContextMenu" Value="{DynamicResource TextBoxContextMenu}" /> <Setter Property="SelectionBrush" Value="{StaticResource TextSelectionBrush}" /> <Setter Property="FontSize" Value="{StaticResource FontSize}">Setter> <Setter Property="FontFamily" Value="{StaticResource FontFamily}">Setter> <Setter Property="Focusable" Value="True"/> <Setter Property="CaretBrush" Value="{StaticResource TextForeground}" /> <Setter Property="VerticalAlignment" Value="Center" /> <Setter Property="SnapsToDevicePixels" Value="True">Setter> <Style.Triggers> <Trigger Property="IsReadOnly" Value="True"> <Setter Property="Opacity" Value="{StaticResource ReadonlyOpacity}">Setter> Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="{StaticResource DisableOpacity}">Setter> Trigger> Style.Triggers> Style>
复制代码

  Global.xaml  

复制代码
    
    <Style TargetType="{x:Type TextBlock}"> <Setter Property="Foreground" Value="{StaticResource TextForeground}"/> <Setter Property="FontFamily" Value="{StaticResource FontFamily}"/> <Setter Property="FontSize" Value="{StaticResource FontSize}"/> Style>  <Style TargetType="{x:Type ToolTip}"> <Setter Property="Foreground" Value="{StaticResource TextForeground}"/> <Setter Property="FontFamily" Value="{StaticResource FontFamily}"/> <Setter Property="FontSize" Value="{StaticResource FontSize}"/> <Setter Property="Background" Value="{StaticResource HeaderBackground}"/> <Setter Property="BorderBrush" Value="{StaticResource FocusBorderBrush}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToolTip}"> <Border CornerRadius="2" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"> <ContentPresenter Margin="8,5,8,5"/> Border> ControlTemplate> Setter.Value> Setter> Style>
复制代码

  TablControl 的样式,TablControl.xaml  

复制代码
    <Style x:Key="FIconTabItemStyle" TargetType="{x:Type TabItem}"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> <Setter Property="VerticalContentAlignment" Value="Stretch"/> <Setter Property="Background" Value="{StaticResource ButtonBackground}"/> <Setter Property="Foreground" Value="{StaticResource TextForeground}" /> <Setter Property="local:ControlAttachProperty.FIcon" Value=""/> <Setter Property="local:ControlAttachProperty.FIconSize" Value="26"/> <Setter Property="local:ControlAttachProperty.CornerRadius" Value="0"/> <Setter Property="local:ControlAttachProperty.FIconMargin" Value="0,0,2,0"/> <Setter Property="local:ControlAttachProperty.FocusBackground" Value="{StaticResource ButtonPressedBackground}"/> <Setter Property="local:ControlAttachProperty.FocusForeground" Value="{StaticResource ButtonMouseOverForeground}"/> <Setter Property="local:ControlAttachProperty.MouseOverBackground" Value="{StaticResource ButtonMouseOverBackground}"/> <Setter Property="local:ControlAttachProperty.MouseOverForeground" Value="{StaticResource ButtonPressedForeground}"/> <Setter Property="MinHeight" Value="20"/> <Setter Property="MinWidth" Value="20"/> <Setter Property="Margin" Value="0"/> <Setter Property="Padding" Value="3"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabItem}"> <Border x:Name="border" Margin="{TemplateBinding Margin}" SnapsToDevicePixels="True" ToolTip="{TemplateBinding ToolTip}" CornerRadius="{TemplateBinding local:ControlAttachProperty.CornerRadius}" Background="{TemplateBinding Background}"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Orientation="Horizontal"> <TextBlock Style="{StaticResource FIcon}" Text="{TemplateBinding local:ControlAttachProperty.FIcon}" Margin="{TemplateBinding local:ControlAttachProperty.FIconMargin}" FontSize="{TemplateBinding local:ControlAttachProperty.FIconSize}" Foreground="{TemplateBinding Foreground}"/> <TextBlock x:Name="txtheader" VerticalAlignment="Center" Text="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}"/> StackPanel> Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="{Binding Path=(local:ControlAttachProperty.MouseOverBackground),RelativeSource={RelativeSource Self}}"/> <Setter Property="Foreground" Value="{Binding Path=(local:ControlAttachProperty.MouseOverForeground),RelativeSource={RelativeSource Self}}"/> Trigger> <Trigger Property="IsSelected" Value="true"> <Setter Property="Background" Value="{Binding Path=(local:ControlAttachProperty.FocusBackground),RelativeSource={RelativeSource Self}}"/> <Setter Property="Foreground" Value="{Binding Path=(local:ControlAttachProperty.FocusForeground),RelativeSource={RelativeSource Self}}"/> Trigger> ControlTemplate.Triggers> ControlTemplate> Setter.Value> Setter> Style> <Style x:Key="LeftTabControl" TargetType="{x:Type TabControl}"> <Setter Property="Padding" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="BorderBrush" Value="{StaticResource ControlBorderBrush}" /> <Setter Property="ItemContainerStyle" Value="{DynamicResource FIconTabItemStyle}"/> <Setter Property="TabStripPlacement" Value="Left">Setter> <Setter Property="local:ControlAttachProperty.FocusBackground" Value="{StaticResource ButtonPressedBackground}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabControl}"> <Grid x:Name="PART_Root" Margin="{TemplateBinding Padding}" > <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> Grid.ColumnDefinitions> <Border BorderBrush="{TemplateBinding local:ControlAttachProperty.FocusBackground}" BorderThickness="0,0,2,0" > <StackPanel x:Name="HeaderPanel" Margin="0,5,0,5" Orientation="Vertical" IsItemsHost="True" >StackPanel> Border> <Border x:Name="ContentPanel" Grid.Column="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local" Width="Auto"> <ContentPresenter ContentSource="SelectedContent" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Width="Auto" /> Border> Grid> ControlTemplate> Setter.Value> Setter> Style> <Style x:Key="TopTabControl" TargetType="{x:Type TabControl}"> <Setter Property="Padding" Value="0"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="ItemContainerStyle" Value="{StaticResource FIconTabItemStyle}"/> <Setter Property="BorderBrush" Value="{StaticResource ControlBorderBrush}" /> <Setter Property="TabStripPlacement" Value="Top">Setter> <Setter Property="local:ControlAttachProperty.FocusBackground" Value="{StaticResource ButtonPressedBackground}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabControl}"> <Grid x:Name="PART_Root" Margin="{TemplateBinding Padding}" > <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> Grid.RowDefinitions> <Border BorderBrush="{TemplateBinding local:ControlAttachProperty.FocusBackground}" BorderThickness="0,0,0,2" > <StackPanel x:Name="HeaderPanel" Margin="5,0,5,0" Orientation="Horizontal" IsItemsHost="True" >StackPanel> Border> <Border x:Name="ContentPanel" Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local" Width="Auto"> <ContentPresenter ContentSource="SelectedContent" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Width="Auto"/> Border> Grid> ControlTemplate> Setter.Value> Setter> Style>
复制代码

   ToggleButton的样式资源

复制代码
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:local="clr-namespace:XLY.Framework.Controls" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style TargetType="{x:Type ToggleButton}" x:Key="DefaultToggleButton"> <Setter Property="Foreground" Value="{StaticResource TextForeground}" /> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid x:Name="Grid" Margin="{TemplateBinding Padding}"> <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/> Grid>  <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="{StaticResource MouseOverForeground}" /> Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Opacity" Value="{StaticResource DisableOpacity}" TargetName="Grid"/> Trigger> ControlTemplate.Triggers> ControlTemplate> Setter.Value> Setter> Style> <Style TargetType="{x:Type ToggleButton}" x:Key="FIconToggleButton"> <Setter Property="Foreground" Value="{StaticResource TextForeground}" /> <Setter Property="local:ControlAttachProperty.FIconSize" Value="20"/> <Setter Property="local:ControlAttachProperty.FIconMargin" Value="1"/> <Setter Property="local:ControlAttachProperty.FIcon" Value=""/> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="Padding" Value="0" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid x:Name="Grid" Margin="{TemplateBinding Padding}"> <TextBlock x:Name="FIcon" FontSize="{Binding Path=(local:ControlAttachProperty.FIconSize),RelativeSource={RelativeSource TemplatedParent}}" Text="{TemplateBinding local:ControlAttachProperty.FIcon}" Foreground="{TemplateBinding Foreground}" Style="{StaticResource FIcon}" Margin="{TemplateBinding local:ControlAttachProperty.FIconMargin}"/> Grid>  <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="{StaticResource MouseOverForeground}" /> Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" /> Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Opacity" Value="{StaticResource DisableOpacity}" TargetName="Grid"/> Trigger> ControlTemplate.Triggers> ControlTemplate> Setter.Value> Setter> Style> ResourceDictionary>
复制代码

 Github项目地址:https://github.com/kwonganding/wpf.controls

版权所有,文章来源:http://www.cnblogs.com/anding

你可能感兴趣的:(WPF自定义控件与样式(15)-终结篇 & 系列文章索引 & 源码共享)