当前位置: 首页 > news >正文

Silverlight 苹果风格按钮Mac OS Style 实现的更新版

在 Silverlight 2 beta 2 时,我曾经写了一篇帖子实现了苹果风格的按钮样式( Silverlight 下苹果 (Mac OS)风格按钮的实现)。

而现在 Silverlight 2 终于发布了,也给之前的代码带来了很多问题,导致无法继续使用。

经过一阵探索,我终于成功修改了这个代码,现在在正式版下也能工作正常了。其关键点如下:
1. 在 beta 2 时,需要采用 <vsm:Setter> 和 <vsm:Style> 的语法编写样式。其中 vsm 是个名称空间引用:
xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
而正式版下直接用 <Style> 和 <Setter> 表签即可。
这个问题如果不修改,程序可以编译通过,但是运行时会报一个莫名其妙的 “ AG_E_PARSER_PROPERTY_NOT_FOUND ”错误。

2. ContentPresenter 和 ContentControl 控件删除了如下属性:
TextDecorations,
TextWrapping,
TextAlignment.
因此,现在必须在 template 中将 ContentPresenter 的定位改用容器 Button 的 HorizontalContentAlignment 和 VerticalContentAlignment 属性来控制。代码如下:

< ContentPresenter Margin= "4,5,4,4" Content= "{TemplateBinding Content}" ContentTemplate= "{TemplateBinding ContentTemplate}" HorizontalAlignment= "{TemplateBinding HorizontalContentAlignment}" VerticalAlignment= "{TemplateBinding VerticalContentAlignment}" />

修改成功后的 Style 全部代码如下:

< UserControl x: Class= "UserControl" xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: x= "http://schemas.microsoft.com/winfx/2006/xaml" xmlns: d= "http://schemas.microsoft.com/expression/blend/2008" xmlns: mc= "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorable= "d" d: DesignWidth= "640" d: DesignHeight= "480" > < UserControl.Resources > < Style x: Key= "MyButton" TargetType= "Button" > < Setter Property= "IsEnabled" Value= "true" /> < Setter Property= "IsTabStop" Value= "true" /> < Setter Property= "Background" Value= "#FF003255" /> < Setter Property= "Foreground" Value= "#FF313131" /> < Setter Property= "MinWidth" Value= "5" /> < Setter Property= "MinHeight" Value= "5" /> < Setter Property= "Margin" Value= "0" /> < Setter Property= "HorizontalContentAlignment" Value= "Center" /> < Setter Property= "VerticalContentAlignment" Value= "Center" /> < Setter Property= "Cursor" Value= "Arrow" /> < Setter Property= "FontSize" Value= "11" /> < Setter Property= "Template" > < Setter.Value > < ControlTemplate TargetType= "Button" > < Grid > < Grid.Resources > < Color x: Key= "LinearBevelLightStartColor" >#FFFFFFFF </ Color > < Color x: Key= "LinearBevelLightEndColor" >#F4E2E0E0 </ Color > < Color x: Key= "LinearBevelDarkStartColor" >#E0E5E5E5 </ Color > < Color x: Key= "LinearBevelDarkEndColor" >#B2FFFFFF </ Color > < Color x: Key= "MouseOverLinearBevelDarkEndColor" >#7FFC1717 </ Color > < Color x: Key= "HoverLinearBevelLightStartColor" >#FCFFFFFF </ Color > < Color x: Key= "HoverLinearBevelLightEndColor" >#EAFFFFFF </ Color > < Color x: Key= "HoverLinearBevelDarkStartColor" >#D8FFFFFF </ Color > < Color x: Key= "HoverLinearBevelDarkEndColor" >#4CFFFFFF </ Color > < Color x: Key= "CurvedBevelFillStartColor" >#B3FFFFFF </ Color > < Color x: Key= "CurvedBevelFillEndColor" >#3CFFFFFF </ Color > < SolidColorBrush x: Key= "BorderBrush" Color= "#FF5E5E5E" /> < SolidColorBrush x: Key= "AccentBrush" Color= "#FF000000" /> < SolidColorBrush x: Key= "DisabledBrush" Color= "#A5FFFFFF" /> < LinearGradientBrush x: Key= "FocusedStrokeBrush" EndPoint= "0.5,1" StartPoint= "0.5,0" > < GradientStop Color= "#B2FFFFFF" Offset= "0" /> < GradientStop Color= "#51FFFFFF" Offset= "1" /> < GradientStop Color= "#66FFFFFF" Offset= "0.325" /> < GradientStop Color= "#1EFFFFFF" Offset= "0.325" /> </ LinearGradientBrush > </ Grid.Resources > < VisualStateManager.VisualStateGroups > < VisualStateGroup x: Name= "CommonStates" > < VisualStateGroup.Transitions > < VisualTransition GeneratedDuration= "00:00:00.2000000" To= "MouseOver" /> < VisualTransition GeneratedDuration= "0:0:0.1" To= "Pressed" /> < VisualTransition GeneratedDuration= "00:00:00.2000000" From= "Normal" To= "MouseOver" /> </ VisualStateGroup.Transitions > < VisualState x: Name= "Normal" > < Storyboard /> </ VisualState > < VisualState x: Name= "MouseOver" > < Storyboard > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#c8d5ed" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#97c2ee" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#6eadee" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#aff9ff" /> </ ColorAnimationUsingKeyFrames > </ Storyboard > </ VisualState > < VisualState x: Name= "Pressed" > < Storyboard > < DoubleAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Offset)" > < SplineDoubleKeyFrame KeyTime= "0" Value= ".2" /> </ DoubleAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#bac5e8" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#7bb2e9" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#4d9ae7" /> </ ColorAnimationUsingKeyFrames > < ColorAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "BackgroundGradient" Storyboard. TargetProperty= "(Shape.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" > < SplineColorKeyFrame KeyTime= "0" Value= "#85eaff" /> </ ColorAnimationUsingKeyFrames > </ Storyboard > </ VisualState > < VisualState x: Name= "Disabled" > < Storyboard > < DoubleAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "DisabledVisual" Storyboard. TargetProperty= "Opacity" > < SplineDoubleKeyFrame KeyTime= "0" Value= "1" /> </ DoubleAnimationUsingKeyFrames > </ Storyboard > </ VisualState > </ VisualStateGroup > < VisualStateGroup x: Name= "FocusStates" > < VisualState x: Name= "Focused" > < Storyboard > < ObjectAnimationUsingKeyFrames Duration= "0" Storyboard. TargetName= "FocusVisual" Storyboard. TargetProperty= "Visibility" > < DiscreteObjectKeyFrame KeyTime= "0" > < DiscreteObjectKeyFrame.Value > < Visibility >Visible </ Visibility > </ DiscreteObjectKeyFrame.Value > </ DiscreteObjectKeyFrame > </ ObjectAnimationUsingKeyFrames > </ Storyboard > </ VisualState > < VisualState x: Name= "Unfocused" > < Storyboard /> </ VisualState > </ VisualStateGroup > </ VisualStateManager.VisualStateGroups > < Rectangle x: Name= "Background" Fill= "{TemplateBinding Background}" RadiusX= "11" RadiusY= "11" /> < Rectangle x: Name= "BackgroundGradient" Stroke= "{StaticResource BorderBrush}" StrokeThickness= "1" RadiusX= "11" RadiusY= "11" Margin= "-1,-1,-1,-1" > < Rectangle.Fill > < LinearGradientBrush EndPoint= "0.7,1" StartPoint= "0.7,0" > < GradientStop Color= "{StaticResource LinearBevelLightStartColor}" Offset= "0" /> < GradientStop Color= "{StaticResource LinearBevelLightEndColor}" Offset= "0.326" /> < GradientStop Color= "{StaticResource LinearBevelDarkStartColor}" Offset= "0.344" /> < GradientStop Color= "#FFFFFFFF" Offset= "0.786" /> </ LinearGradientBrush > </ Rectangle.Fill > </ Rectangle > < Grid x: Name= "FocusVisual" Visibility= "Collapsed" > < Rectangle Margin= "-2,1,-2,-2" Stroke= "{StaticResource AccentBrush}" StrokeThickness= "1" StrokeDashArray= "1.5 1.5" RadiusX= "3" RadiusY= "3" /> </ Grid > < ContentPresenter Margin= "4,5,4,4" Content= "{TemplateBinding Content}" ContentTemplate= "{TemplateBinding ContentTemplate}" HorizontalAlignment= "{TemplateBinding HorizontalContentAlignment}" VerticalAlignment= "{TemplateBinding VerticalContentAlignment}" /> < Rectangle x: Name= "DisabledVisual" IsHitTestVisible= "false" Opacity= "0" Fill= "{StaticResource DisabledBrush}" RadiusX= "11" RadiusY= "11" Margin= "-1,-1,-1,-1" /> </ Grid > </ ControlTemplate > </ Setter.Value > </ Setter > </ Style > </ UserControl.Resources > < Grid x: Name= "LayoutRoot" Background= "White" > < Button Height= "35" HorizontalAlignment= "Stretch" Margin= "198,132,262,0" Style= "{StaticResource MyButton}" VerticalAlignment= "Top" Content= "Button" /> </ Grid > </ UserControl > 引用:http://msdn.microsoft.com/zh-cn/library/dd391775.aspx

相关文章:

  • C# CHECKEDLISTBOX控件用法总结(怎样得到多选的值)
  • CDP
  • 浅谈电池和充电方面的知识
  • Android 开发 数据结构理解 队列和栈 分析及实现
  • LINQ:是BUG还是~~~
  • JQuery之ContextMenu(右键菜单)
  • cisco路由器乱码的解决办法
  • 这个季节的忧伤,点到为止
  • DHCP Snooping + Dynamic ARP Inspection配置
  • iphone 如何将数据存储到plist(属性列表文件)中
  • *** 2003
  • Oracle认证:Oracle10g恢复试验方法
  • 程序员的职业道德
  • 【算法导论】贪心算法,递归算法,动态规划算法总结
  • 淘宝web服务器tengine
  • [译]Python中的类属性与实例属性的区别
  • 【Leetcode】104. 二叉树的最大深度
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • docker-consul
  • docker容器内的网络抓包
  • JavaScript DOM 10 - 滚动
  • Java到底能干嘛?
  • js ES6 求数组的交集,并集,还有差集
  • Laravel Telescope:优雅的应用调试工具
  • Making An Indicator With Pure CSS
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python3 使用 asyncio 代替线程
  • Shadow DOM 内部构造及如何构建独立组件
  • vue总结
  • Webpack 4 学习01(基础配置)
  • 跨域
  • 盘点那些不知名却常用的 Git 操作
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 首页查询功能的一次实现过程
  • 通过git安装npm私有模块
  • 正则与JS中的正则
  • # Java NIO(一)FileChannel
  • #13 yum、编译安装与sed命令的使用
  • (1)(1.13) SiK无线电高级配置(五)
  • (11)MSP430F5529 定时器B
  • (4)(4.6) Triducer
  • (42)STM32——LCD显示屏实验笔记
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)理解angular中的module和injector,即依赖注入
  • (四)汇编语言——简单程序
  • (一)RocketMQ初步认识
  • *Django中的Ajax 纯js的书写样式1
  • .Net 4.0并行库实用性演练
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 回调、接口回调、 委托
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET程序员迈向卓越的必由之路
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!