WPF 实现大转盘抽奖~

WPF开发者QQ群: 340500857

       由于微信群人数太多入群请添加小编微信号

 yanjinhuawechat 或 W_Feng_aiQ 入群

 需备注WPF开发者 

  PS:有更好的方式欢迎推荐。

  接着上一篇圆形控件

01

代码如下

一、创建 PrizeItemControl.cs代码如下。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPFDevelopers.Controls
{[TemplatePart(Name = RotateTransformTemplateName, Type = typeof(RotateTransform))]public class PrizeItemControl : Control{private static readonly Type _typeofSelf = typeof(PrizeItemControl);private const string RotateTransformTemplateName = "PART_RotateTransform";private RotateTransform _angleRotateTransform;public double Angle{get { return (double)GetValue(AngleProperty); }set { SetValue(AngleProperty, value); }}public static readonly DependencyProperty AngleProperty =DependencyProperty.Register("Angle", typeof(double), typeof(PrizeItemControl), new UIPropertyMetadata(OnAngleChanged));private static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){PrizeItemControl control = (PrizeItemControl)d;control.UpdateAngle();}void UpdateAngle(){if (_angleRotateTransform == null) return;_angleRotateTransform.Angle = Angle;}public string Title{get { return (string)GetValue(TitleProperty); }set { SetValue(TitleProperty, value); }}public static readonly DependencyProperty TitleProperty =DependencyProperty.Register("Title", typeof(string), typeof(PrizeItemControl), new PropertyMetadata(string.Empty));public Brush BackgroundColor{get { return (Brush)GetValue(BackgroundColorProperty); }set { SetValue(BackgroundColorProperty, value); }}public static readonly DependencyProperty BackgroundColorProperty =DependencyProperty.Register("BackgroundColor", typeof(Brush), typeof(PrizeItemControl), new PropertyMetadata(null));static PrizeItemControl(){DefaultStyleKeyProperty.OverrideMetadata(_typeofSelf, new FrameworkPropertyMetadata(_typeofSelf));}public override void OnApplyTemplate(){base.OnApplyTemplate();_angleRotateTransform = GetTemplateChild(RotateTransformTemplateName) as RotateTransform;UpdateAngle();}}
}

二、创建 DrawPrize.cs代码如下。

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;namespace WPFDevelopers.Controls
{[TemplatePart(Name = BorderTemplateName, Type = typeof(Border))][TemplatePart(Name = RotateTransformTemplateName, Type = typeof(RotateTransform))]public class DrawPrize : ListBox{private const string BorderTemplateName = "PART_Border";private const string RotateTransformTemplateName = "PART_ItemsControlAngle";private Border _border;private RotateTransform _rotateTransform;public List<int> ListAngle{get { return (List<int>)GetValue(ListAngleProperty); }set { SetValue(ListAngleProperty, value); }}public static readonly DependencyProperty ListAngleProperty =DependencyProperty.Register("ListAngle", typeof(List<int>), typeof(DrawPrize), new PropertyMetadata());private int value;static DrawPrize(){DefaultStyleKeyProperty.OverrideMetadata(typeof(DrawPrize), new FrameworkPropertyMetadata(typeof(DrawPrize)));}public override void OnApplyTemplate(){base.OnApplyTemplate();AlternationCount = 8;_border = GetTemplateChild(BorderTemplateName) as Border;_rotateTransform = GetTemplateChild(RotateTransformTemplateName) as RotateTransform;_border.MouseDown += _border_MouseDown;}private void _border_MouseDown(object sender, MouseButtonEventArgs e){_border.IsEnabled = false;_border.Cursor = Cursors.None;var random = new Random();var to = random.Next(0, 8);var doubleAnimation = new DoubleAnimationUsingKeyFrames();value = ListAngle[to];var splineDoubleKey1 = new SplineDoubleKeyFrame{KeyTime = TimeSpan.FromSeconds(0),Value = value % 360,};var splineDoubleKey2 = new SplineDoubleKeyFrame{KeyTime = TimeSpan.FromMilliseconds(1000),Value = 360,};var splineDoubleKey3 = new SplineDoubleKeyFrame{KeyTime = TimeSpan.FromMilliseconds(2000),Value = 1230,};var splineDoubleKey4 = new SplineDoubleKeyFrame{KeyTime = TimeSpan.FromMilliseconds(4000),Value = value,KeySpline = new KeySpline(0, 0, 0, 1)};doubleAnimation.KeyFrames.Add(splineDoubleKey1);doubleAnimation.KeyFrames.Add(splineDoubleKey2);doubleAnimation.KeyFrames.Add(splineDoubleKey3);doubleAnimation.KeyFrames.Add(splineDoubleKey4);doubleAnimation.Completed += (s1,e1)=> { _border.IsEnabled = true; _border.Cursor = Cursors.Hand; };_rotateTransform.BeginAnimation(RotateTransform.AngleProperty, doubleAnimation);}}
}

三、创建 PrizeItemControl.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"xmlns:convert="clr-namespace:WPFDevelopers.Converts"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/><ResourceDictionary Source="Basic/Animations.xaml"/></ResourceDictionary.MergedDictionaries><Style TargetType="{x:Type controls:PrizeItemControl}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="controls:PrizeItemControl"><Grid VerticalAlignment="Top"><Grid.RenderTransform><RotateTransform x:Name="PART_RotateTransform" Angle="{TemplateBinding Angle}" CenterX="200" CenterY="200"></RotateTransform></Grid.RenderTransform><Path x:Name="PART_Path" Data="{StaticResource PathSector}" Fill="{TemplateBinding BackgroundColor}" VerticalAlignment="Center"/><TextBlock Text="{TemplateBinding Title}" RenderTransformOrigin="0.5,0.5"Margin="50,100,0,0" Foreground="{DynamicResource WhiteSolidColorBrush}"FontSize="16"FontWeight="DemiBold"HorizontalAlignment="Left" VerticalAlignment="Center" ><TextBlock.RenderTransform><RotateTransform Angle="-70"/></TextBlock.RenderTransform></TextBlock></Grid></ControlTemplate></Setter.Value></Setter></Style><convert:DrawPrizeIndexToColor x:Key="drawPrizeIndexToColor"/><Style TargetType="{x:Type controls:DrawPrize}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Width" Value="400"/><Setter Property="Height" Value="400"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:DrawPrize}"><Grid><ItemsControl x:Name="PART_ItemsControl" ItemsSource="{TemplateBinding ItemsSource}"AlternationCount="{TemplateBinding AlternationCount}"Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"RenderTransformOrigin=".5,.5"><ItemsControl.RenderTransform><RotateTransform x:Name="PART_ItemsControlAngle" Angle="0"/></ItemsControl.RenderTransform><ItemsControl.ItemTemplate><DataTemplate><controls:PrizeItemControl Angle="{Binding Angle}"BackgroundColor="{Binding Path=(ItemsControl.AlternationIndex),RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource drawPrizeIndexToColor}}" Title="{Binding Title}"></controls:PrizeItemControl></DataTemplate></ItemsControl.ItemTemplate><ItemsControl.ItemsPanel><ItemsPanelTemplate><Grid/></ItemsPanelTemplate></ItemsControl.ItemsPanel></ItemsControl><Path Data="M562.8 77.6c-31.4-18.1-70.1-18.1-101.5 0C215.4 219.5 64 481.8 64 765.6c0 36.3 19.4 69.8 50.8 87.9 245.8 141.9 548.7 141.9 794.5 0 31.4-18.1 50.8-51.7 50.8-87.9-0.1-283.8-151.5-546.1-397.3-688z"Stretch="Fill" Fill="#fbb845"Width="40" Height="120"Margin="0,0,0,50"></Path><Border Background="#fbb845" x:Name="PART_Border"Width="100" Height="100"CornerRadius="50"Cursor="Hand"><TextBlock Text="GO" Foreground="{DynamicResource WhiteSolidColorBrush}"FontSize="40"FontWeight="DemiBold"VerticalAlignment="Center"HorizontalAlignment="Center"/></Border></Grid></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>

四、创建 DrawPrizeExample.xaml代码如下。

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.DrawPrizeExample"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"><StackPanel><wpfdev:DrawPrize x:Name="PART_DrawPrize" ItemsSource="{Binding MenuArray,RelativeSource={RelativeSource AncestorType=local:DrawPrizeExample}}"ListAngle="{Binding ListAngle,RelativeSource={RelativeSource AncestorType=local:DrawPrizeExample}}"></wpfdev:DrawPrize></StackPanel>
</UserControl>

五、 DrawPrizeExample.xaml.cs代码如下。

using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using WPFDevelopers.Samples.Models;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// DrawPrizeExample.xaml 的交互逻辑/// </summary>public partial class DrawPrizeExample : UserControl{public IEnumerable MenuArray{get { return (IEnumerable)GetValue(MenuArrayProperty); }set { SetValue(MenuArrayProperty, value); }}public static readonly DependencyProperty MenuArrayProperty =DependencyProperty.Register("MenuArray", typeof(IEnumerable), typeof(DrawPrizeExample), new PropertyMetadata(null));public List<int> ListAngle{get { return (List<int>)GetValue(ListAngleProperty); }set { SetValue(ListAngleProperty, value); }}public static readonly DependencyProperty ListAngleProperty =DependencyProperty.Register("ListAngle", typeof(List<int>), typeof(DrawPrizeExample), new PropertyMetadata());public DrawPrizeExample(){InitializeComponent();this.Loaded += DrawPrizeExample_Loaded;}private void DrawPrizeExample_Loaded(object sender, RoutedEventArgs e){ListAngle = new List<int>();var menuItemModels = new List<MenuItemModel>();var angle = 0;var anglePrize = 2000;for (int i = 0; i <= 7; i++){var prizeTitle = i == 0 ? "谢谢参与" : $"{i}等奖";angle += 45;anglePrize += 45;ListAngle.Add(anglePrize);menuItemModels.Add(new MenuItemModel { Angle = angle, Title = prizeTitle});}MenuArray = menuItemModels;}}
}

02


效果预览

鸣谢素材提供者 - 方拯

感谢大家一直以来的支持,祝你在新的一年心想事成,万事如意。

源码地址如下

Github:https://github.com/WPFDevelopersOrg

Gitee:https://gitee.com/WPFDevelopersOrg

WPF开发者QQ群: 340500857 

Github:https://github.com/WPFDevelopersOrg

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

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

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

70730e3d3d9f5a117bfb1223e365e4b0.png

扫一扫关注我们,

06d983df0074f0835a75104de0444998.gif

更多知识早知道!

87d6203286b794699211a2f4f308567d.gif

点击阅读原文可跳转至源代码

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

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

相关文章

如何隐晦地表达“滚”?

1 学到了&#xff01;现在开始带薪难过&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 实力演绎什么叫祸不单行&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 报了驾校之后鞋子都不敢换了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 糊…

Beyond Compare中插入表格数据的教程

众所周知&#xff0c;Beyond Compare是目前市面上功能最强大的文件对比软件&#xff0c;也是类似软件中使用最广泛的一种&#xff0c;Beyond Compare支持文件夹对比&#xff0c;文本对比&#xff0c;表格对比&#xff0c;图片对比&#xff0c;注册表对比&#xff0c;Mp3对比。对…

EF Core 6 新功能汇总(二)

继上一篇之后&#xff0c;这一篇将给大家带来另外十个 EF Core 6 中的新功能特性&#xff0c;包括值转换器、脚手架和 DbContext 的改进等。1HasConversion 支持值转换器在 EF Core 6.0 中&#xff0c;HasConversion 方法的泛型重载方法可以指定内置或自定义的值转换器。public…

linux之lsusb命令和cd -命令使用总结

1、lsusb命令介绍 使用 lsusb 来列出 USB 设备和它的属性,lsusb 会显示驱动和内部连接到你系统的设备。直接在控制台输入 lsusb 即可 2、lsusb简单使用 在控制台输入 lsusb 效果如下 系统中同时使用了 USB 2.0 root hub 驱动和 USB 3.0 root hub 驱动。 bus 002 指明设备…

Fiddler (五) Mac下使用Fiddler

http://www.cnblogs.com/TankXiao/archive/2013/04/18/3027971.html Fiddler是用C#开发的。 所以Fiddler不能在Mac系统中运行。 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢&#xff1f; Fiddler可以允许“远程连接”。 我们可以利用这个间接来实…

她花了8个月让骗子爱上自己,然后把骗子引到警察局......

1 相信你一定可以的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 凤凰传奇的buff有多强&#xff1f;&#xff08;via.段子楼&#xff0c;侵删&#xff09;▼3 老板的名字实在太有味道了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 被微信骰子气死…

精彩回顾|2021 中国 .NET 开发者峰会

.NET Conf China 2021 是面向开发人员的社区峰会&#xff0c;基于 .NET Conf 2021&#xff0c;庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展。峰会由来自北京、上海、苏州、深圳、武汉、广州、青岛、烟台、杭州等各地区的 .NET 技术社区共同发起举办&#xff0c;由微…

wms地图绘制工具_移情地图,了解用户需求的利器

如果你想打造一款成功的产品&#xff0c;对你的用户有一个良好的了解是至关重要的。虽然用户体验设计师有许多技能可以帮助他们发展这种理解&#xff0c;但有一种关键技能有很多优势&#xff0c;它称为移情地图。User-Experience Quiz: 2018 UX Year in Review(NN/g)中有一题问…

把准脉搏 U-Mail邮件系统2014开足马力

为什么80%的码农都做不了架构师&#xff1f;>>> 马年春节即将来临&#xff0c;在过去的一年&#xff0c;U-Mail邮件服务器从用户需求出发&#xff0c;围绕着为用户打造稳定、安全、高效、易操作、助管理的邮件系统目标&#xff0c;三军用命&#xff0c;取得了不俗业…

Maven私服的简单搭建教程(Nexus)

2019独角兽企业重金招聘Python工程师标准>>> 第一步&#xff0c;下载nexus的安装包并解压 链接&#xff1a;http://pan.baidu.com/s/1jIhpZ98 密码&#xff1a;6bqx 如果不能下载给我私信&#xff0c;最近也一直在想把这些东西方github上&#xff0c;但是想想自己老…

el-popover超过固定高度后出现滚动条_「测绘精选」RTK测量不出现固定解的原因...

摘要&#xff1a;在日常RTK测量的应用中&#xff0c;时常不出现固定解的情况&#xff0c;导致测量测绘工作无法按时完成或者测量测绘结果精度无法保证。本文将从基准站、移动站、数据链等三个方面进行分析。随着卫星定位技术的快速发展&#xff0c;人们对快速高精度位置信息的需…

史上最牛物理科普

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

MySQL备份原理详解

备份是数据安全的最后一道防线&#xff0c;对于任何数据丢失的场景&#xff0c;备份虽然不一定能恢复百分之百的数据(取决于备份周期)&#xff0c;但至少能将损失降到最低。衡量备份恢复有两个重要的指标&#xff1a;恢复点目标(RPO)和恢复时间目标(RTO)&#xff0c;前者重点关…

linux c之通过管道实现兄弟间进程通信:

1、兄弟间进程通信&#xff1a; 父进程创建管道&#xff0c;并使用fork函数创建2个进程&#xff0c;在第一个子进程发消息到第二个子进程&#xff0c;第2个子进程读取消息并处理&#xff0c;在父进程中不使用管道通信&#xff0c;所以什么都不做&#xff0c;直接关闭管道两端并…

理解 Azure AD 安全默认值设置

为了保护广大的Microsoft 365用户的安全&#xff0c;Azure AD在某些情况下会启用安全默认值&#xff0c;就是要求所有的账号都启用MFA。MFA的全称是 Multi-factor Authentication&#xff0c;中文翻译为多因子身份验证&#xff0c;就是说除了账号密码之外&#xff0c;添加额外的…

能抗 6 级风的「拇指伞」,晴雨两用、揣兜就走!

▲ 点击查看每到这个季节&#xff0c;天气就开始对人类不友好了&#xff1a;要么万里无云&#xff0c;紫外线爆表&#xff1b;要么忽然乌云密布&#xff0c;狂风暴雨。出门带伞&#xff0c;谁不知道&#xff0c;说着简单&#xff0c;可是普通的雨伞大小很尴尬&#xff0c;手里不…

SecureCRT 中 python 命令行使用退格键(backspace)出现 ^H 解决办法

选项-->会话选项-->映射键 勾选“其他映射”中的两个选择框 转载于:https://www.cnblogs.com/RUReady/p/6165289.html

云计算基本概念

IT技术行业最不缺少的就是概念的炒作&#xff0c;今天出来个新技术名词&#xff0c;明天又出来个新技术名词&#xff0c;搞的从业人员焦虑不堪&#xff0c;生怕被这个时代所抛弃&#xff1b;但是人的精力是有限的&#xff0c;不可能什么都去学习&#xff0c;与其整天被这一帮发…

通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...

很久没有更新dapr系列了。今天带来的是一个小的组件集成&#xff0c;通过多级缓存框架来实现对服务的缓存保护&#xff0c;依旧是一个简易的演示以及对其设计原理思路的讲解&#xff0c;欢迎大家转发留言和star目录&#xff1a;一、通过Dapr实现一个简单的基于.net的微服务电商…