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,一经查实,立即删除!

相关文章

python8皇后不攻击问题_Python八皇后问题(落最后一颗子)

最近在看Python基础&#xff0c;遇到了八皇后问题&#xff0c;看得整个人晕晕乎乎&#xff0c;甚至开始怀疑人生。问题是在一个8*8的国际象棋棋盘上摆放8个皇后&#xff0c;问题一是找出一个解&#xff0c;问题二是问有多少个解。这里我把我自己的理解写出来&#xff0c;只针对…

Could not find result map

"Exception: org.apache.ibatis.builder.xml.IncompleteStatementException: Could not find result map....." 在使用mybatis 3 和spring 3整合的时候&#xff0c;往往粗心的人会在过程中出现以上错误。--------------------------原因是: ***-mapper.xml文件中的 r…

php中unset面试题,php unset和引用——由一道php面试题引发的思考

$test"aaaaa";$abc&$test;unset($test);echo $abc;为什么结果会输出aaaaa呢&#xff0c;$test不是销毁了吗&#xff1f;$abc引用一个销毁的怎么输出的不是空白呢&#xff1f;查了下资料&#xff0c;将原因分析如下&#xff1a;变量存储数据时可以理解为变量的值放…

python下载matplotlib.finance模块_关于Matplotlib中No module named 'matplotlib.finance'的解决办法...

最近在研究量化分析&#xff0c;需要用到matplotlib中的一个库&#xff0c;输入from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc发现有报错&#xff0c;仔细勘查后发现有两个问题&#xff0c;一个是matplotlib模块已经剔除了&#xff0c;所以得…

托管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格式&…

打造自己博客(wordpress)的wap手机版本

这儿介绍我试用的两款插件&#xff1a;wordpress-mobile-edition和wp-t-wap。1.先说一下两者的区别。 wordpress-mobile-edition插件使用后&#xff0c;可以用手机直接访问你的博客主域名&#xff0c;手机会自动调整成wap版本。我的诺基亚6730上测试&#xff0c;自带的浏览器可…

猴子偷桃php代码,C++实现猴子吃桃的示例代码

题目详情有一天&#xff0c;某只猴子摘了一些桃子&#xff0c;当时吃了一半&#xff0c;又不过瘾&#xff0c;于是就多吃了一个。以后每天如此&#xff0c;到第n天想吃时&#xff0c;发现就只剩下一个桃子。输入n&#xff0c;表示到第n天剩下1个桃子&#xff0c;请计算第一天猴…

网吧也用VDI?

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

socket python json_python实现的基于TCP的JSON数据通信

用Python写的一个多线程TCP通信实例&#xff0c;实现了JSON数据的传输。闲言少述&#xff0c;直接上代码​一、client#!/usr/bin/env python# -*- coding:utf-8 -*-#import socketimport threadingimport SocketServerimport jsondef client(ip, port, message):sock socket.s…

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

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

django 1.3下关于静态文件staticfiles的设置

Django 1.3版本发布有些日子了&#xff0c;在站点被屏蔽的这段时间里学习也处于荒废状态&#xff0c;因此到今天才真正接触到新版下Static文件的处理设置&#xff0c;希望不算太晚。更改设置涉及的文件&#xff1a;settings.py1import os.path2HERE_PATHos.path.dirname(__file…

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

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

ofbiz中的数据模型

DelegatorDelegator是整个ofbiz中数据库访问的入口&#xff0c;具体实现是GenericDelegator类&#xff0c;在这个类中通过protected ModelReader modelReader null;protected ModelGroupReader modelGroupReader null;这两个属性变量去查找在xml文件中定义的数据模型ModelRea…

oracle 大页配置,【Oracle】Oracle如何开启大页

前言&#xff1a;在Linux中配置hugepage可以提高oracle的性能&#xff0c;减少oracle sga的页交换&#xff0c;类似于aix中的lagepage。为什么 使用大页&#xff1f;LINUX内存的默认块大小是4K如果SGA为&#xff1a;128Gselect 128* 1024* 1024/4 from dual;33554432个块(三千多…

python关联分析sklearn_Python3利用pandas,sklearn进行关联度分析以及预测的demo

做个简单的demo记录下&#xff0c;防止忘记先看原始数据&#xff1a;一共有5列&#xff1a;日期&#xff0c;金钱&#xff0c;性别&#xff0c;工作年限,年龄。我们的目的是要分析各个维度对金钱的影响。关联度分析代码&#xff1a;# -*- coding: utf-8 -*-from numpy import a…

NLB+Cluster(一)

这也算是个群集系列版吧&#xff01;首先在前面大家已经看到了利用openfiler建立仲裁磁盘&#xff0c;然后通过Linux开源软件openfiler与windows群集的结合一文看到了windows cluster群集上如何构建文件共享及DHCP服务。那么本次我们将要升级到一个较高的层次&#xff0c;来看一…

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

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

JS设置文本框只能是数字和小数点。

核心提示&#xff1a;JS判断只能是数字和小数点 只能输入字母和汉字 只能输入字母和汉字 JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input οnkeyup"this.valuethis.value.replace(/\D/g,)" onafterpaste"this.valuethis.value…