No. 8958 实现Windows 7样式Aero TreeView控件(三):样式绘制
2010-07-02 02:43
225 查看
Windows7AeroTreeView的效果样式,不说废话,分析样式:
左图为Windows7资源管理器树型目录一部分的截图,当他放大到800%时就能看到右侧的清晰的像素级图片,可以看到音乐项的效果,放大的部分是鼠标划过树目录项的效果,简单的来分析一下效果,最外边是一个深色的单像素边框,在内侧仔细看有一层接近白色的一像素内边框,内部背景呢,则是由上而下的一个渐变颜色,用取色软件分析之后有了以下的色彩结构:
开始的时候,我以为内边框只是一个简单单色边框,后来对比效果才发现,内边框原来也是由上而下的渐变颜色,TreeViewItem的控件模板结构如下:
左图为Windows7资源管理器树型目录一部分的截图,当他放大到800%时就能看到右侧的清晰的像素级图片,可以看到音乐项的效果,放大的部分是鼠标划过树目录项的效果,简单的来分析一下效果,最外边是一个深色的单像素边框,在内侧仔细看有一层接近白色的一像素内边框,内部背景呢,则是由上而下的一个渐变颜色,用取色软件分析之后有了以下的色彩结构:
开始的时候,我以为内边框只是一个简单单色边框,后来对比效果才发现,内边框原来也是由上而下的渐变颜色,TreeViewItem的控件模板结构如下:
<ControlTemplateTargetType="{x:TypeTreeViewItem}"> <ControlTemplate.Resources> <o2ds:IndentConverterIndent="19"x:Key="indentConverter"/> </ControlTemplate.Resources> <StackPanelHeight="Auto"> <Borderx:Name="outBorder"BorderThickness="1"CornerRadius="2"Margin="1,1,0,0"> <Borderx:Name="itemBorder"Padding="{TemplateBindingPadding}"Margin="0"
CornerRadius="1"Background="{TemplateBindingBackground}" BorderBrush="{TemplateBindingBorderBrush}" BorderThickness="{TemplateBindingBorderThickness}"> <GridMargin="{BindingConverter={StaticResourceindentConverter},RelativeSource=
{RelativeSourceTemplatedParent}}"> <Grid.ColumnDefinitions> <ColumnDefinitionWidth="19"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <ToggleButtonGrid.Column="0"x:Name="ArrowButton"Style="{StaticResource
TreeViewArrowButtonStyle}" IsChecked="{BindingPath=IsExpanded,RelativeSource={RelativeSource
TemplatedParent}}" ClickMode="Press"/> <ContentPresenterGrid.Column="1"x:Name="PART_Header"ContentSource="Header" HorizontalAlignment="{TemplateBinding
HorizontalContentAlignment}"/> </Grid> </Border> </Border> <ItemsPresenterx:Name="ItemsHost"/> </StackPanel> </ControlTemplate>
在模板里面设置了根节点StackPanel,上面分析了边框是两层,所以定义了两个嵌套的Border对象,由于某些列表项可能会有不相同的设置,所以我酌情绑定了一些相对的属性,比如说在内边框绑定Padding属性,如果真有需求比如像Margin的属性可能就要酌情绑定到外侧outBorder对象上去了,至于选中效果的布局问题我在上一篇博文里面有详细的说明,具体色彩的实现以及交互效果呢,都是通过Trigger来实现的,代码如下:
<ControlTemplate.Triggers>
<TriggerProperty="IsExpanded"Value="False">
<SetterTargetName="ItemsHost"Property="Visibility"Value="Collapsed"/>
</Trigger>
<TriggerProperty="HasItems"Value="False">
<SetterTargetName="ArrowButton"Property="Visibility"Value="Hidden"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<ConditionProperty="HasHeader"Value="False"/>
<ConditionProperty="Width"Value="Auto"/>
</MultiTrigger.Conditions>
<SetterTargetName="PART_Header"Property="MinWidth"Value="75"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<ConditionProperty="HasHeader"Value="False"/>
<ConditionProperty="Height"Value="Auto"/>
</MultiTrigger.Conditions>
<SetterTargetName="PART_Header"Property="MinHeight"Value="19"/>
</MultiTrigger>
<TriggerProperty="IsSelected"Value="true">
<SetterTargetName="itemBorder"Property="Background"Value="{StaticResource
ResourceKey=SelectedBackgroundBrush}"/>
<SetterTargetName="itemBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedInnerBorderBrush}"/>
<SetterTargetName="outBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedOutBorderBrush}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<ConditionProperty="IsSelected"Value="true"/>
<ConditionProperty="IsSelectionActive"Value="false"/>
</MultiTrigger.Conditions>
<SetterTargetName="itemBorder"Property="Background"Value="{StaticResource
ResourceKey=SelectedLostFoucsBackgroundBrush}"/>
<SetterTargetName="itemBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedLostFoucsInnerBorderBrush}"/>
<SetterTargetName="outBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedLostFoucsOutBorderBrush}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<ConditionProperty="IsMouseOver"Value="True"/>
<ConditionProperty="IsSelected"Value="True"/>
</MultiTrigger.Conditions>
<SetterTargetName="itemBorder"Property="Background"Value="{StaticResource
ResourceKey=SelectedMouseMoveBackgroundBrush}"/>
<SetterTargetName="itemBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedMouseMoveInnerBorderBrush}"/>
<SetterTargetName="outBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=SelectedMouseMoveOutBorderBrush}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<ConditionSourceName="itemBorder"Property="IsMouseOver"Value="True"/>
<ConditionProperty="IsSelected"Value="False"/>
</MultiTrigger.Conditions>
<SetterTargetName="itemBorder"Property="Background"Value="{StaticResource
ResourceKey=MouseMoveBackgroundBrush}"/>
<SetterTargetName="itemBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=MouseMoveInnerBorderBrush}"/>
<SetterTargetName="outBorder"Property="BorderBrush"Value="{StaticResource
ResourceKey=MouseMoveOutBorderBrush}"/>
</MultiTrigger>
</ControlTemplate.Triggers>
上面代码可以看出来这里面定义了大概四种状态,分别是:
笔刷代码就不重复帖出了,状态效果配色方案如上所示。
此博文由WindowsLiveWriter4编辑完成,微软在前些天发布了
由这篇博文之后,高仿Windows7AeroTreeView效果就基本上实现了,还有类似于鼠标移出TreeView所有Arrow全部消失得效果,我决定在有空的时候在添加,从代码的角度,这是我能实现的感觉上最优雅的写法,希望有高人高法,可以不吝赐教。
相关文章推荐
- No. 8948 实现Windows 7 样式 Aero TreeView 控件(一):差异分析
- Qt之界面实现技巧-- 窗体显示,绘制背景,圆角,QSS样式
- 窗体样式使用WS_EX_LAYERED后,无法绘制windows控件的解决办法
- 实现自定义Windows窗体样式,酷!
- Qt之界面实现技巧-- 窗体显示,绘制背景,圆角,QSS样式
- 窗体样式使用WS_EX_LAYERED后,无法绘制windows控件的解决办法
- Windows 下利用MFC实现的中国象棋棋盘绘制程序
- 窗体背景的绘制(Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景)
- Windows 7样式地址栏(Address Bar)控件实现
- NO1:安装VMLinux虚拟机,安装配置Samba实现Linux与Windows文件共享
- Android实现Windows 8磁贴(Tile)样式按钮
- DosBox的Windows下的编译与其字体绘制实现
- Windows 7样式地址栏(Address Bar)控件实现
- Android实现Windows 8磁贴(Tile)样式按钮
- DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制
- Windows编程 GDI简单图形的绘制 简单实现锁帧效果
- C# windows mobile中实现控件的动态绘制与动态删除
- Windows 7样式地址栏(Address Bar)控件实现
- Qt之界面实现技巧-- 窗体显示,绘制背景,圆角,QSS样式
- 用vnc实现windows远程连接linux桌面