Silverlight2 边学边练 之七 模板与状态
感觉书里讲的模板好复杂,看的我一头雾水。书中说常规Button组件的模板程序
打印出来需要4张纸那么多(恐怖~)。看来想利用好模板这东东还真不是件易事。
言归正传,本篇也以按键为例来练习模板(Template)与状态(State)相关知识。
首先要了解一下Button的状态,Button一共有2个状态组、6种状态:
CommonStates:Normal、MouseOver、Pressed、Disabled
FocusStates:Focused、Unfocused
下面来了解一下如何利用这些状态为Button设定模板,先看Demo效果:
XAML Code:
<UserControl x:Class="TemplateTest.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="120"> <!--创建Resource--> <UserControl.Resources> <!--创建Button模板--> <ControlTemplate x:Key="ButtonTemplate" TargetType="Button"> <!--设置RenderTransformOrigin以Button中心为变形原点--> <Grid RenderTransformOrigin="0.5,0.5"> <!--默认Grid缩放比例为1:1--> <Grid.RenderTransform> <ScaleTransform x:Name="ScaleTransform" ScaleX="1" ScaleY="1"> </ScaleTransform> </Grid.RenderTransform> <!--创建VisualState组,共用2个组--> <VisualStateManager.VisualStateGroups> <!--组1:常规状态组,共用4个状态--> <VisualStateGroup x:Name="CommonStates"> <!--状态1:鼠标从Button上移开,从MouseOver状态转为Normal状态--> <VisualStateGroup.Transitions> <VisualTransition From="MouseOver" To="Normal" GeneratedDuration="0:0:0.7"> <Storyboard> <!--将Grid ScaleX比例从0变为1,即从小变大--> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleX"> <LinearDoubleKeyFrame KeyTime="0:0:0.5" Value="0"> </LinearDoubleKeyFrame> <LinearDoubleKeyFrame KeyTime="0:0:0.7" Value="1"> </LinearDoubleKeyFrame> </DoubleAnimationUsingKeyFrames> </Storyboard> </VisualTransition> </VisualStateGroup.Transitions> <!--状态2:鼠标移动到Button上的状态--> <VisualState x:Name="MouseOver"> <Storyboard> <!--Button底色变为橙色--> <ColorAnimation Duration="0:0:0" Storyboard.TargetName="ButtonBackgroundBrush" Storyboard.TargetProperty="Color" To="Orange" /> </Storyboard> </VisualState> <!--状态3:常规状态--> <VisualState x:Name="Normal"> <Storyboard> <!--Button底色变为红色--> <ColorAnimation Duration="0:0:0" Storyboard.TargetName="ButtonBackgroundBrush" Storyboard.TargetProperty="Color" To="Red" /> <!--焦点框透明度为0--> <DoubleAnimation Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity" To="0" /> </Storyboard> </VisualState> <!--状态4:点击状态--> <VisualState x:Name="Pressed"> <Storyboard> <!--边框颜色变为黑色--> <ColorAnimation Duration="0:0:0" Storyboard.TargetName="BorderBrush" Storyboard.TargetProperty="Color" To="Black" /> </Storyboard> </VisualState> </VisualStateGroup> <!--组2:鼠标点击后的焦点状态,共2个状态--> <VisualStateGroup x:Name="FocusStates"> <!--状态1:点击状态--> <VisualState x:Name="Focused"> <Storyboard> <!--焦点框透明度为1--> <DoubleAnimation Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity" To="1" /> </Storyboard> </VisualState> <!--状态2:非点击状态--> <VisualState x:Name="Unfocused"> <Storyboard> <!--焦点框透明度0--> <DoubleAnimation Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity" To="0" /> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!--创建Button属性--> <Border x:Name="ButtonBorder" BorderThickness="5" CornerRadius="15"> <!--边框色--> <Border.BorderBrush> <SolidColorBrush x:Name="BorderBrush" Color="Orange"></SolidColorBrush> </Border.BorderBrush> <!--底色--> <Border.Background> <SolidColorBrush x:Name="ButtonBackgroundBrush" Color="Red"></SolidColorBrush> </Border.Background> <!--文字显示部分绑定了Button默认模板--> <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0,5,0,5" /> </Border> <!--鼠标点击后的焦点框--> <Rectangle x:Name="FocusVisualElement" Stroke="Black" Margin="8" Opacity="0" RadiusX="10" RadiusY="10" StrokeThickness="1" StrokeDashArray="1 2"></Rectangle> </Grid> </ControlTemplate> <!--设定Button风格--> <Style x:Key="ButtonStyle" TargetType="Button"> <!--模板引用上面创建的ButtonTemplate模板--> <Setter Property="Template" Value="{StaticResource ButtonTemplate}"></Setter> <!--文字颜色--> <Setter Property="Foreground" Value="White"></Setter> <!--文字大小--> <Setter Property="FontSize" Value="15"></Setter> </Style> </UserControl.Resources> <!--创建两个Button,均引用ButtonStyle风格--> <Grid x:Name="LayoutRoot" Background="White" Margin="5"> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <Button Margin="5" Content="Button One" Style="{StaticResource ButtonStyle}"></Button> <Button Grid.Row="2" Margin="5" Content="Button Two" Style="{StaticResource ButtonStyle}" ></Button> </Grid> </UserControl>
有时看书的上的内容怎么也搞不明白,不知道书里说什么呢。找一些实例操练一下再返回去看书,
便知其所云,毛主席教导我们说:“实践出真知”吗。
本例参考自《Pro Silverlight 2 in C# 2008》CHAPTER 11 STYLES, TEMPLATES, AND CUSTOM CONTROLS
作者:李敬然(Gnie)
出处:{GnieTech} (http://www.cnblogs.com/gnielee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
出处:{GnieTech} (http://www.cnblogs.com/gnielee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述