WPF实现聚光灯效果

WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

欢迎转发、分享、点赞、在看,谢谢~。5f4e9d8850eae62770343a08b539a350.png  

前言

        效果仿照 CSS聚光灯效果 

https://www.jianshu.com/p/6eae322e8e38

a067b1eeb6262fc1e2ffc04e9dc28365.png

01

效果预览

更多效果请下载源码体验

一、SpotLight.cs 代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;namespace WPFDevelopers.Controls
{[TemplatePart(Name = TextBlockBottomTemplateName, Type = typeof(TextBlock))][TemplatePart(Name = TextBlockTopTemplateName, Type = typeof(TextBlock))][TemplatePart(Name = EllipseGeometryTemplateName, Type = typeof(EllipseGeometry))]public class SpotLight : Control{private const string TextBlockBottomTemplateName = "PART_TextBlockBottom";private const string TextBlockTopTemplateName = "PART_TextBlockTop";private const string EllipseGeometryTemplateName = "PART_EllipseGeometry";private TextBlock _textBlockBottom, _textBlockTop;private EllipseGeometry _ellipseGeometry;public string Text{get { return (string)GetValue(TextProperty); }set { SetValue(TextProperty, value); }}public static readonly DependencyProperty TextProperty =DependencyProperty.Register("Text", typeof(string), typeof(SpotLight), new PropertyMetadata("WPFDevelopers"));static SpotLight(){DefaultStyleKeyProperty.OverrideMetadata(typeof(SpotLight), new FrameworkPropertyMetadata(typeof(SpotLight)));}public SpotLight(){this.Loaded += SpotLight_Loaded;}private void SpotLight_Loaded(object sender, RoutedEventArgs e){Canvas.SetLeft(_textBlockBottom, ActualWidth / 3);Canvas.SetTop(_textBlockBottom, ActualHeight / 3);Canvas.SetLeft(_textBlockTop, ActualWidth / 3);Canvas.SetTop(_textBlockTop, ActualHeight / 3);}public override void OnApplyTemplate(){base.OnApplyTemplate();_textBlockBottom = GetTemplateChild(TextBlockBottomTemplateName) as TextBlock;_textBlockTop = GetTemplateChild(TextBlockTopTemplateName) as TextBlock;_ellipseGeometry = GetTemplateChild(EllipseGeometryTemplateName) as EllipseGeometry;var center = new Point(FontSize/2, FontSize/2); _ellipseGeometry.RadiusX = FontSize;_ellipseGeometry.RadiusY = FontSize;_ellipseGeometry.Center = center;if (_textBlockBottom != null && _textBlockTop != null && _ellipseGeometry != null)_textBlockTop.Loaded += _textBlockTop_Loaded;}private void _textBlockTop_Loaded(object sender, RoutedEventArgs e){var doubleAnimation = new DoubleAnimation{To = _textBlockTop.ActualWidth,Duration = TimeSpan.FromSeconds(3)};Storyboard.SetTarget(doubleAnimation, _textBlockTop);Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(UIElement.Clip).(EllipseGeometry.Transform).(TranslateTransform.X)"));var storyboard = new Storyboard{RepeatBehavior = RepeatBehavior.Forever,AutoReverse = true};storyboard.Children.Add(doubleAnimation);storyboard.Completed += (s, q) => {};storyboard.Begin();}}
}

二、SpotLight.xaml 代码如下

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:WPFDevelopers.Controls"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/></ResourceDictionary.MergedDictionaries><Style TargetType="{x:Type controls:SpotLight}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Background" Value="#222222"/><Setter Property="FontSize" Value="60"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:SpotLight}"><Canvas x:Name="PART_Canvas" Background="{TemplateBinding Background}"><TextBlock x:Name="PART_TextBlockBottom" Text="{TemplateBinding Text}"FontSize="{TemplateBinding FontSize}" FontFamily="Arial Black"FontWeight="Bold" Foreground="#323232"/><TextBlock x:Name="PART_TextBlockTop" Text="{TemplateBinding Text}"FontSize="{TemplateBinding FontSize}" FontFamily="Arial Black"FontWeight="Bold"><TextBlock.Foreground><LinearGradientBrush EndPoint="1,1" MappingMode="RelativeToBoundingBox" StartPoint="0,0"><GradientStop Color="#FF9C1031" Offset="0.1"/><GradientStop Color="#FFBE0E20" Offset="0.2"/><GradientStop Color="#FF9C12AC" Offset="0.7"/><GradientStop Color="#FF0A8DC3" Offset="0.8"/><GradientStop Color="#FF1AEBCC" Offset="1"/></LinearGradientBrush></TextBlock.Foreground><TextBlock.Clip><EllipseGeometry x:Name="PART_EllipseGeometry"><EllipseGeometry.Transform><TranslateTransform/></EllipseGeometry.Transform></EllipseGeometry></TextBlock.Clip></TextBlock></Canvas></ControlTemplate></Setter.Value></Setter>
</Style></ResourceDictionary>

三、SpotLightExample.Xaml 代码如下

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.SpotLightExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UniformGrid Rows="2"><wpfdev:SpotLight FontSize="50" Text="YanJinHua"/><wpfdev:SpotLight/></UniformGrid>
</UserControl>

源码地址

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857 

blogs: https://www.cnblogs.com/yanjinhua

Github:https://github.com/yanjinhuagood

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

托管PE文件

文/玄魂 中间语言 在.NET框架中&#xff0c;公共语言基础结构使用CLS来绑定不同的语言。通过要求不同的语言至少要实现CTS包含在CLS中的部分&#xff0c;公共语言基础结构允许不同的语言使用.NET框架。因此&#xff0c;在.NET框架中&#xff0c;所有的语言&#xff08;C#、VB.N…

带你见识不一样的世界,这5部豆瓣纪录片不可错过!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片一直都是增长见识又带给你力量的东西&#xff0c;你可能忙于学业、生活、工作而不能行万里路&#xff0c;但至少你还可以看纪录片&#xff0c;从一方屏幕看到整个世界。今天就为大家整理了5部高分纪录片&#xff0c;文末附领取方式…

客户要求ASP.NET Core API返回特定格式,怎么办?(续)

前言上次&#xff0c;我们用客户就要求API的返回值属性名必须是PascalCase&#xff08;如UserName&#xff09;&#xff0c;但是这些API需要同时提供给内部系统使用&#xff0c;默认都是CamelCase&#xff08;如userName&#xff09;。其实&#xff0c;返回的都是JSON格式&…

网吧也用VDI?

升级360以后&#xff0c;挨个菜单都点了一遍&#xff0c;虽然没啥用处&#xff0c;清清垃圾&#xff0c;升级下软件&#xff0c;清理下启动项还是很不错滴。 清理启动项的时候就搞笑了&#xff0c;发现Citrix联机插件居然被360识别为网吧无盘工作站连接中心。ICA Client我想了好…

知乎超高赞:见识多的人,平时都在看些什么?

全世界只有3.14 % 的人关注了爆炸吧知识微信新功能总在悄咪咪更新&#xff0c;“拍一拍”一出&#xff0c;很多小伙伴都会收到各种群里面千奇百怪的“拍一拍”&#xff0c;到底都是谁在偷偷关注你&#xff1f;真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内…

究竟是什么可以比反射还快实现动态调用?| Source Generators版

前言最近在公众号上看到一篇文章《究竟是什么可以比反射还快实现动态调用&#xff1f;》&#xff0c;它使用的是Newbe.ObjectVisitor&#xff0c;基于C#表达式树访问一个普通class的所有属性和对应的值&#xff0c;可以拥有比直接使用反射快上10倍的性能。就这一需求来说&#…

只要懂得拒绝,哪会有什么狗血感情与莫名其妙的误会

1 就凭你&#xff1f;也想握朕的手&#xff1f;2 来&#xff0c;快站好~抱好娃&#xff01;拍全家福啦&#xff01;3 自我约束有利于家庭和谐&#xff0c;嗯&#xff01;4 问题来了&#xff0c;你是夜灯党还是漆黑党&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

android笔记之在WebView中显示ProgressBar的两种方法

http://blog.csdn.net/liuzhidong123/article/details/6450334 本文基于Creative Commons Attribution 2.5 China Mainland License发布&#xff0c;欢迎转载&#xff0c;演绎或用于商业目的&#xff0c;但是必须保留本文的署名http://www.cnblogs.com/luminji&#xff08;包含…

绝对不能错过!2009~2019 高中数学联赛11年真题解析

全世界只有3.14 % 的人关注了爆炸吧知识参加过高中数学联赛的同学都知道&#xff0c;全国高中数学联赛作为中国数学会及各省、市、自治区数学会的一项经常性工作&#xff0c;是属于较高等级的数学竞赛&#xff0c;其地位远高于各省自行组织的数学竞赛。为什么这个竞赛会这么特别…

在Win7中怎样打开摄像头?

在Win7中怎样打开摄像头&#xff1f;标题所说的问题在我装了win7后也遇到了&#xff0c;当时我也只会用等下我说的第一个方法打开摄像头&#xff0c;不过幸运的是我在前些天了解到了另外一个方法&#xff0c;那么现在我先讲下这个问题出现的原因吧&#xff1a;在Win7推出后就因…

活久见啊,WPF工资已经这么高了!

金九银十高薪季&#xff0c;WPF招聘大厂多高薪多&#xff0c;阿里影视、百度地图、华为小米、小鹏特斯拉、美的碧桂园等都在招WPF人才&#xff0c;薪资30w起步&#xff0c;真心太牛了&#xff01;为何WPF上位机自动化能异军突起&#xff1f;其实就是站在了IOT物联网的风口&…

视图加载时自动执行铵钮事件

再学习一个方法&#xff0c;就是在ASP.NET MVC视图加载时&#xff0c;让jQuery自动执行一个铵钮事件。在控制器添加一个Action操作&#xff1a; 先在视图实现一个铵钮事件&#xff1a; 看看上面运行时的效果&#xff0c;当视图加载时&#xff0c;需要人为去点击铵钮&#xff0c…

硕博士的朋友圈都有哪些特点?

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉&#xff0c;读了硕士博士后&#xff0c;兴趣会突然间发生很大变化&#xff0c;发朋友圈也会不一样了。而真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人…

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题目录一、触屏事件连带触发鼠标事件的问题二、DataGrid 误触问题及解决方法独立观察员 2021 年 10 月 10 日一、触屏事件连带触发鼠标事件的问题这个是 WPF 已知的问题&#xff0c;网络上也有一些讨论&#xff0c;但是没有…

听说,99%的数学家都算不出这道题

全世界只有3.14 % 的人关注了爆炸吧知识著名的数学家毕达哥拉斯曾说&#xff1a;“朋友是你灵魂的倩影&#xff0c;要像220与284一样亲密。”就因为不经意的一句话&#xff0c;引发了一场数群和数学家长达几千年的“斗争”&#xff0c;甚至到现在依然没有结束&#xff01;无数个…

oracle账号区分大小写吗,实战Oracle 11g用户密码不区分大小写

连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> show  parameter sec_case_sensitive_logonNAME TYPE VAL…

sql 多表多行模糊查询_从零开始学习SQL(五)多表查询

经过之前的学习&#xff0c;现在我们已经对查询有了一定的了解&#xff0c;但是我们目前的所有查询都只能找到在一张表中的数据&#xff0c;但如果我们需要寻找分布在多张表格中的数据时&#xff0c;这种之前的查询就做不到了&#xff0c;这时就需要引入一种新的查询方法&#…

最新.NET MAUI有什么惊喜?

点击蓝字关注我们.NET 6 RC1 现已发布啦&#xff0c;我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局。这是性能和可靠性的重大变化。我们很高兴我们还增加了一些关于accessibility方面的基于新的SemanticService、字体缩放选项和对Xamarin.Forms 效果的兼容性的功能…

亲一下就搞定的事,绝不花钱解决!

1 好了&#xff0c;你表演吧&#xff0c;球不看了2 “你这个车&#xff0c;至少得100条小鱼干啊” 3 羡慕了4 还…还有这种操作&#xff1f;5 被秀了一脸哈哈哈6 没有什么是一个么么哒解决不了的&#xff01;你点的每个赞&#xff0c;我都认真当成了喜欢

微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

微软今天发布了Visual Studio 2022 最接近正式发布的RC版本&#xff0c;同时宣布在11月8日发布正式版&#xff0c;届时将在线上发布虚拟的发布活动&#xff0c;具体参见&#xff1a;https://devblogs.microsoft.com/visualstudio/join-us-november-8th-for-the-launch-of-visua…