第17章 控件模版(6)——通过样式应用模版
来源:互联网 发布:www.4399js.com 编辑:程序博客网 时间:2024/06/06 15:37
通过前面几节的学习可以看出:控件模板硬编码了一些细节,如颜色方案。这意味着如果希望在按钮中使用相同的元素组合(Border、Grid、Rectangle和ContentPresenter)并采用相同的方式安排他们,但希望提供不同的颜色方案,就必须创建引用不同画刷资源的控件模板副本。
为了解决上述问题,可将那些需要修改的属性(通常是颜色和字体)从模板中提取出来,通过样式进行设置。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <!-- Resources used by the template. --> <RadialGradientBrush RadiusX="1" RadiusY="5" GradientOrigin="0.5,0.3" x:Key="HighlightBackground"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Blue" Offset=".4" /> </RadialGradientBrush> <RadialGradientBrush RadiusX="1" RadiusY="5" GradientOrigin="0.5,0.3" x:Key="PressedBackground"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Blue" Offset="1" /> </RadialGradientBrush> <SolidColorBrush Color="Blue" x:Key="DefaultBackground"></SolidColorBrush> <SolidColorBrush Color="Gray" x:Key="DisabledBackground"></SolidColorBrush> <RadialGradientBrush RadiusX="1" RadiusY="5" GradientOrigin="0.5,0.3" x:Key="Border"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Blue" Offset="1" /> </RadialGradientBrush> <!-- The button control template. --> <ControlTemplate x:Key="GradientButtonTemplate" TargetType="{x:Type Button}"> <Border Name="Border" BorderThickness="2" CornerRadius="2" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"> <Grid> <Rectangle Name="FocusCue" Visibility="Hidden" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2" SnapsToDevicePixels="True"> </Rectangle> <ContentPresenter Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"></ContentPresenter> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsKeyboardFocused" Value="True"> <Setter TargetName="FocusCue" Property="Visibility" Value="Visible"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> <!-- The style that applies the button control template. --> <Style x:Key="GradientButtonStyle" TargetType="{x:Type Button}"> <Setter Property="Control.Template" Value="{StaticResource GradientButtonTemplate}"></Setter> <Setter Property="BorderBrush" Value="{StaticResource Border}"></Setter> <Setter Property="Background" Value="{StaticResource DefaultBackground}"></Setter> <Setter Property="TextBlock.Foreground" Value="White"></Setter> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{StaticResource HighlightBackground}" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="{StaticResource PressedBackground}" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Background" Value="{StaticResource DisabledBackground}"></Setter> </Trigger> </Style.Triggers> </Style></ResourceDictionary>注意:
①在理想情况下,应能在控件模板中保留所有触发器,因为他们代表控件的行为,并使用样式简单设置基本属性。当上面的代码因为想对不同的触发器实现不同的颜色方案,所以只能在样式中设置了触发器。
②如果在控件的模板和样式中都设置了触发器,那么样式触发器具有优先权。
③当使用这个新模版时不用在设置Template属性了,要设置Style属性。
④但上面的代码也有局限性,比如,若想实现不同的颜色方案又需要创建多个样式。为了解决这个问题可以是使用自定义控件,后面第18章会详细讲解。
0 0
- 第17章 控件模版(6)——通过样式应用模版
- 第17章 控件模版(7)——通过样式自动应用模版
- 第17章 控件模版(2)——模版绑定
- 第17章 控件模版(1)——模版的创建与使用
- 第17章 控件模版(5)——组织模版资源概述
- 第17章 控件模版(3)——属性触发器
- 第17章 控件模版(4)——事件触发器
- 第17章 控件模版(8)——动态换肤
- MSDN控件样式和模版
- 模版——函数模版、类模版
- ASP.NET 2.0 GridView控件应用模版
- C++——模版:函数模版
- C++——模版:类模版
- slider(滑动条)控件模版,样式--用图片定义控件模版
- 【C++ Primer】第16章 模版与泛型模版
- wpf button 样式模版
- CSS公共样式模版
- eclipse 代码模版样式
- 使用NSURLSessionDataTask发送get和post请求
- 数据结构经典算法学习之01背包问题
- Android多语言适配文件夹命名
- 生成树
- 大学是什么?如何渡过?
- 第17章 控件模版(6)——通过样式应用模版
- 1关于网络的思考,pc如何接入互联网 2互联网是什么? 3pc之间怎么互相访问?
- LuceneInAction-实现简单的搜索功能
- df 命令结果显示的 Size 不等于 Avail + Used
- 【设计模式】全局观之为什么分三大类
- DataGrip 使用技巧四
- 常用matlab脚本
- java.lang.OutOfMemoryError: PermGen space解决方法
- JavaScript 的关键字和保留字大全