WPF-实现Windows 7 样式 Aero TreeView 控件
关于实现Windows 7 样式 Aero TreeView 控件的具体过程可以参考如下文章
http://www.cnblogs.com/o2ds/archive/2010/06/22/1763020.html
这里主要附上完整的样式以及如何将样式应用到TreeView.ItemTemplate上。
完整样式如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:Test;assembly=Test"> <SolidColorBrush x:Key="SelectedOutBorderBrush" Color="#84ACDD"></SolidColorBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedInnerBorderBrush">
<GradientStop Color="#F1F7FE" Offset="0"/>
<GradientStop Color="#DEEDFE" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedBackgroundBrush">
<GradientStop Color="#EBF4FE" Offset="0"/>
<GradientStop Color="#CFE4FE" Offset="1"/>
</LinearGradientBrush> <SolidColorBrush x:Key="SelectedLostFoucsOutBorderBrush" Color="#D9D9D9"></SolidColorBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedLostFoucsInnerBorderBrush">
<GradientStop Color="#FAFAFB" Offset="0"/>
<GradientStop Color="#F0F0F0" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedLostFoucsBackgroundBrush">
<GradientStop Color="#F8F8F8" Offset="0"/>
<GradientStop Color="#E5E5E5" Offset="1"/>
</LinearGradientBrush> <SolidColorBrush x:Key="SelectedMouseMoveOutBorderBrush" Color="#7DA2CE"></SolidColorBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedMouseMoveInnerBorderBrush">
<GradientStop Color="#EBF4FD" Offset="0"/>
<GradientStop Color="#DBEAFD" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="SelectedMouseMoveBackgroundBrush">
<GradientStop Color="#DCEBFC" Offset="0"/>
<GradientStop Color="#C1DBFC" Offset="1"/>
</LinearGradientBrush> <SolidColorBrush x:Key="MouseMoveOutBorderBrush" Color="#B8D6FB"></SolidColorBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="MouseMoveInnerBorderBrush">
<GradientStop Color="#FCFDFE" Offset="0"/>
<GradientStop Color="#F2F7FE" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="MouseMoveBackgroundBrush">
<GradientStop Color="#FAFBFD" Offset="0"/>
<GradientStop Color="#EBF3FD" Offset="1"/>
</LinearGradientBrush> <Style x:Key="TreeViewItemFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<PathGeometry x:Key="TreeArrow" Figures="M0,0 L0,6 L6,0 z"/>
<Style x:Key="TreeViewArrowButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Width" Value="16"/>
<Setter Property="Height" Value="16"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Background="Transparent" Height="16" Padding="5,5,5,5" Width="16">
<Path x:Name="ExpandPath" Data="{StaticResource TreeArrow}" Fill="Transparent" Stroke="#FF989898">
<Path.RenderTransform>
<RotateTransform Angle="135" CenterY="3" CenterX="3"/>
</Path.RenderTransform>
</Path>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Stroke" TargetName="ExpandPath" Value="#FF1BBBFA"/>
<Setter Property="Fill" TargetName="ExpandPath" Value="Transparent"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="RenderTransform" TargetName="ExpandPath">
<Setter.Value>
<RotateTransform Angle="180" CenterY="3" CenterX="3"/>
</Setter.Value>
</Setter>
<Setter Property="Fill" TargetName="ExpandPath" Value="#FF595959"/>
<Setter Property="Stroke" TargetName="ExpandPath" Value="#FF262626"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style> <Style TargetType="{x:Type TreeViewItem}" x:Key="TreeViewItemTest">
<Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>
<Setter Property="IsExpanded" Value="True"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<ControlTemplate.Resources>
<src:IndentConverter Indent="19" MarginLeft="0" x:Key="indentConverter" />
</ControlTemplate.Resources>
<StackPanel Height="Auto">
<Border x:Name="outBorder" BorderThickness="1" CornerRadius="2" Margin="1,1,2,0">
<Border x:Name="itemBorder" Padding="{TemplateBinding Padding}" Margin="0" CornerRadius="1" Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" >
<Grid Margin="{Binding Converter={StaticResource indentConverter},RelativeSource={RelativeSource TemplatedParent}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="19" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0" x:Name="ArrowButton" Style="{StaticResource TreeViewArrowButtonStyle}"
IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press" />
<ContentPresenter Grid.Column="1" x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
</Grid>
</Border>
</Border>
<ItemsPresenter x:Name="ItemsHost" />
</StackPanel> <ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="HasItems" Value="False">
<Setter TargetName="ArrowButton" Property="Visibility" Value="Hidden" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="False" />
<Condition Property="Width" Value="Auto" />
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinWidth" Value="75" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="False" />
<Condition Property="Height" Value="Auto" />
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinHeight" Value="19" />
</MultiTrigger>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="itemBorder" Property="Background" Value="{StaticResource ResourceKey=SelectedBackgroundBrush}"/>
<Setter TargetName="itemBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedInnerBorderBrush}" />
<Setter TargetName="outBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedOutBorderBrush}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter TargetName="itemBorder" Property="Background" Value="{StaticResource ResourceKey=SelectedLostFoucsBackgroundBrush}" />
<Setter TargetName="itemBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedLostFoucsInnerBorderBrush}" />
<Setter TargetName="outBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedLostFoucsOutBorderBrush}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="itemBorder" Property="Background" Value="{StaticResource ResourceKey=SelectedMouseMoveBackgroundBrush}" />
<Setter TargetName="itemBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedMouseMoveInnerBorderBrush}" />
<Setter TargetName="outBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=SelectedMouseMoveOutBorderBrush}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition SourceName="itemBorder" Property="IsMouseOver" Value="True" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="itemBorder" Property="Background" Value="{StaticResource ResourceKey=MouseMoveBackgroundBrush}" />
<Setter TargetName="itemBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=MouseMoveInnerBorderBrush}" />
<Setter TargetName="outBorder" Property="BorderBrush" Value="{StaticResource ResourceKey=MouseMoveOutBorderBrush}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style> </ResourceDictionary>
然而,如果使用HierarchicalDataTemplate或者DataTemplate对TreeView的ItemTemplate进行了重写,则会发现上述样式无法应用。使用方法是设置TreeView的ItemContainerStyle属性。如:<TreeView ItemContainerStyle="{DynamicResource TreeViewItemTest}"></TreeView>。这样即可将样式应用到DataTemplate上。
文章已迁移到:http://www.izonso.com/forum.php
WPF-实现Windows 7 样式 Aero TreeView 控件的更多相关文章
- C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】
(一)Windows窗口(MDICLIENT)样式介绍 /* Windows窗口样式 */ WS_BORDER //带有边框的窗口 WS_CAPTION //带有标题栏的窗口 WS_CHILD //子 ...
- WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 菜单M ...
- 【转】WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 菜单Menu的自定义样式: 右键菜单ContextMenu的自定义样式 ...
- WPF 自定义TreeView控件样式,仿QQ联系人列表
一.前言 TreeView控件在项目中使用比较频繁,普通的TreeView并不能满足我们的需求.因此我们需要滴对TreeView进行改造.下面的内容将介绍仿QQ联系人TreeView样式及TreeVi ...
- WPF自定义控件与样式(10)-进度控件ProcessBar自定义样
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Pro ...
- WPF中TreeView控件的使用案例
WPF总体来说还是比较方便的,其中变化最大的主要是Listview和Treeview控件,而且TreeView似乎在WPF是一个备受指责的控件,很多人说他不好用.我这个demo主要是在wpf中使用Tr ...
- WPF中TreeView控件SelectedItemChanged方法的MVVM绑定
问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- WPF自定义控件(二)の重写原生控件样式模板
话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...
随机推荐
- 计算 MD5值
// // MD5Value.h // iOSEdu // // Created by littest on 16/2/26. // Copyright © 2016年 littest. All ri ...
- 用java 删除mongodb的数据
import java.net.UnknownHostException; import com.mongodb.BasicDBObject;import com.mongodb.DB;import ...
- [转]Oracle hang分析
hanganalyze是ORACLE的一款性能诊断工具,这个款工具是从oracle 8.0.6开始可用,在oracle数据库出现严重的性能问题的时候它可以帮助你定位问题所在. 1.首先说说hangan ...
- linux-rm
rm可以删除文件夹和文件 rm -rf强制删除不询问 rm /* 自杀绝技,赶紧跑吧 mkdir -p创建父目录 mkdir -p /tmp/wsb/dgl(wsb这个文件夹之前没有) rmdi ...
- HTTP重定向服务器
程序基本流程如下: 代码组织结构如下: HTTP重定向服务主线程: package com.server; import java.io.IOException; import java.net.Se ...
- [未完成]关于POI的使用
关于POI的使用关于POI的使用关于POI的使用关于POI的使用
- ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析
ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法.ExecutorService接口中的大部分API都是比较容易上手使用的,本文主 ...
- poj 3565 二分图最优匹配
思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...
- ubuntu不能正常使用make menuconfig的解决方案
so easy sudo apt-get install build-essentialsudo apt-get install libncurses5sudo apt-get install lib ...
- hostname
http://www.linuxidc.com/Linux/2014-11/109238.htm