原文:UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系(walter.lv@qq.com)。 https://blog.csdn.net/WPwalter/article/details/79947274

在 Windows 10.0.16299 中,RevealBrush 被引入,可以实现炫酷的鼠标滑过高亮效果和点击光照。本文将告诉大家如何完整地实现这样的效果。


Reveal 的效果(自带)

在微软官方推荐的 XAML Controls Gallery 应用中,我们可以找到 Reveal 的实现章节。下图是应用中演示的 Reveal 效果:

不过在其实现中,全都是使用的系统自带的样式,例如:

<Button Style="{StaticResource ButtonRevealStyle}" Content="Button" />
<Grid HorizontalAlignment="Center" Margin="5" Background="{ThemeResource CustomAcrylicInAppBrush_dark}" RequestedTheme="Dark"><StackPanel Orientation="Vertical"><StackPanel Orientation="Horizontal"><AppBarButton Style="{ThemeResource AppBarButtonRevealStyle}" Icon="World" Margin="1, 2, 0, 0"/><AppBarButton Style="{ThemeResource AppBarButtonRevealStyle}" Icon="CellPhone" Margin="0, 2, 1, 0"/></StackPanel><StackPanel Orientation="Horizontal"><AppBarButton Style="{ThemeResource AppBarButtonRevealStyle}" Icon="Delete" Margin="1, 2, 0, 2"/><AppBarButton Style="{ThemeResource AppBarButtonRevealStyle}" Icon="Comment" Margin="0, 2, 1, 2"/></StackPanel></StackPanel>
</Grid>

Reveal 的制作(自己实现)

采用自带效果的控件看起来实现很容易,不过 UWP 控件的自带样式略坑,自己实现控件样式和模板是不可避免的事儿。

这是定制的 ListViewItem 的模板的一部分,写了 RevealBorderBrushRevealBackgroundBrush

<Grid x:Name="Root" Width="120" Height="40" BorderThickness="0 1 1 0"><Grid.BorderBrush><RevealBorderBrush /></Grid.BorderBrush><Grid.Background><RevealBackgroundBrush /></Grid.Background><ContentPresenter />
</Grid>

运行看,发现只有边框效果,背景效果是不存在的。

然而官方文档对于 RevealBackgroundBrush 的实现竟然没有提及,也是挺奇怪的。比如:Reveal highlight - UWP app developer - Microsoft Docs 和 RevealBackgroundBrush Class (Windows.UI.Xaml.Media) - UWP app developer - Microsoft Docs 。

注意到 RevealBackgroundBrush 有一个附加属性 RevealBrush.State,设置到控件上用于指定采用哪一种光照效果:RevealBrush.State="Pressed"。直接将其设置到控件上,发现依然是没有效果的:

看来需要动态地改变,于是必须加上 VisualStateManager

<Grid x:Name="Root" Width="120" Height="40" BorderThickness="0 1 1 0"><Grid.BorderBrush><RevealBorderBrush /></Grid.BorderBrush><Grid.Background><RevealBackgroundBrush /></Grid.Background><ContentPresenter /><VisualStateManager.VisualStateGroups><VisualStateGroup x:Name="CommonStates"><VisualState x:Name="Normal" /><VisualState x:Name="Selected" /><VisualState x:Name="PointerOver"><VisualState.Setters><Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/></VisualState.Setters></VisualState><VisualState x:Name="PointerOverSelected"><VisualState.Setters><Setter Target="Root.(RevealBrush.State)" Value="PointerOver"/></VisualState.Setters></VisualState><VisualState x:Name="PointerOverPressed"><VisualState.Setters><Setter Target="Root.(RevealBrush.State)" Value="Pressed"/></VisualState.Setters></VisualState><VisualState x:Name="Pressed"><VisualState.Setters><Setter Target="Root.(RevealBrush.State)" Value="Pressed"/></VisualState.Setters></VisualState><VisualState x:Name="PressedSelected"><VisualState.Setters><Setter Target="Root.(RevealBrush.State)" Value="Pressed"/></VisualState.Setters></VisualState></VisualStateGroup><VisualStateGroup x:Name="DisabledStates"><VisualState x:Name="Enabled"/><VisualState x:Name="Disabled"><VisualState.Setters><Setter Target="Root.RevealBorderThickness" Value="0"/></VisualState.Setters></VisualState></VisualStateGroup></VisualStateManager.VisualStateGroups>
</Grid>

在以上这段新的代码中,我们适时在指针设备滑过的时候切换 RevealBrush.StatePointerOver,在按下时切换 RevealBrush.StatePressed。再次运行才发现背景光照效果正常出现了。

本文相关

  • 本文所设计的源码来自我的一个个人兴趣项目,已在 GitHub 上开源:walterlv/AssembleMailing。
  • 我写过另一篇让 WPF 实现光照效果的博客:流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!

UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)...相关推荐

  1. 目录忽略_宣传册设计中目录的构思方法和运用

    宣传册设计中有一项最容易被忽略,却也极为重要的内容就是目录.目录的设计导向着整个宣传册内容的坐标和布局.就好比阅读受众进入了购物中心,如何能快速准确的找到自己所心仪的内容并达成目的就要通过良好的指引. ...

  2. ae制h5文字动画_AE动画在H5设计中的应用研究

    龙源期刊网 http://www.qikan.com.cn AE 动画在 H5 设计中的应用研究 作者:刘洁羽 来源:<大观> 2018 年第 12 期 摘 要:伴随智能手机和互联网移动终 ...

  3. UWP 查找模板中的控件

    UWP 查找模板中的控件 原文:UWP 查找模板中的控件 这个标题我也不知道咋起,意思说一下你就明白. 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,Gr ...

  4. altium pcb 信号高亮_在PCB设计中高效的放置元件技巧

    在印刷电路板设计中,设置电路板轮廓后,将零件(占地面积)调用到工作区.然后将零件重新放置到正确的位置,并在完成后进行接线. 组件放置是这项工作的第一步,对于之后的平滑布线工作是非常重要的工作.如果在接 ...

  5. cad中tk什么意思_设计中的“Neobject”什么意思?来了解一下

    Design Architecture Interiors Fashion Art Transport THE STUFF THAT REFINES YOU 破界造物 New Language ? & ...

  6. 15个著名的设计心理学原理以及在设计中的应用

    你是否有在听别人说某某原理法则时一脸懵B的时候?明明知道这个原理却说不出它的名字?不要紧,本文就来介绍与人机交互设计相关的15个常见的设计心理学原理,帮助你了解产品的定位,需求目的和交互逻辑,洞悉用户 ...

  7. 水彩在网页设计中应用的15个优秀案例

    这篇文章和大家分享水彩在网页设计中应用的一些优秀案例.水彩它给人的感觉有2种,一种是给人"水"的感觉,非常流畅和透明:另一种是给人"色彩"的感觉,各种不同的色彩 ...

  8. 中剪取一种颜色的板块_不知道UI设计中APP界面版式如何排版?来看这个!

    UI设计中APP的界面看似只有几个简单的元素组合起来, 所有元素的绘制可以说比较简单: 然而,当一个产品原型出来后,设计师如果单纯按原型来进行设计而不考虑信息化规则, 那么很多时候就会出现不协调的效果 ...

  9. Ui设计中的动画如何应用,你知道吗?

    UI设计中的动效 站在用户的立场对每段动画做出决断,"挺好看的"可不是正确答案. 保持每段动画时间不超过300ms. 避免使用线性动画,它使得动画看起来迟缓.无趣且机械. 99%的 ...

最新文章

  1. 企业中常用的几种文件传输方法介绍
  2. php函数文件,PHP文件函数大全
  3. iOS小知识点(非UI部分)
  4. .NET 开源配置组件 AgileConfig 初体验
  5. Rejection sampling - 直观解释
  6. 百度seo排名规则_百度关键词seo优化排名如何上首页
  7. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态
  8. Bootstrap Table的使用小结
  9. 中国电信叫停不限量套餐 套外资费3元/GB
  10. IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑
  11. spring boot api文档_Spring Boot: Spring Doc生成OpenAPI3.0文档
  12. php disable-ipv6,強迫 PHP Curl 使用 IPv4 , 忽略 IPv6
  13. E680手机内存已满终极解决方案
  14. HDFS容错性设计有哪些?
  15. 从事java开发工作三年的感想
  16. Mac 平台下功能强大的Shimo软件使用指南
  17. Application.streamingAssetsPath在android和ios和pc上的读取
  18. 使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3
  19. 过期域名查询php程序,一个域名查询的程序
  20. 长春人文学院第四组孙乃宇https://blog.csdn.net/weixin_59347653?spm=1010.2135.3001.5421 js笔记

热门文章

  1. Yii和ThinkPHP对比心得
  2. MANIFEST.MF
  3. 使用instantclient_11_2和PL/SQL Developer工具包连接oracle 11g远程数据库
  4. JavaScript Cookie
  5. mysqlinsert触发器的创建
  6. (转) 通过UUID在vSphere虚拟机内外识别硬盘
  7. phpcms v9 后台添加修改页面空白页问题解决方法
  8. 关于VS2017编译UE4项目,输出窗口有乱码的解决方案
  9. WPF引用外部类库中的资源文件提示不能找到的解决方法
  10. 【白皮书分享】2020用户生命周期运营白皮书2.0.pdf(附下载链接)