WPF实现环(圆)形菜单

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

 前言,接着上一篇圆形菜单。

欢迎转发、分享、点赞、在看,谢谢~。  

01

效果预览

效果预览(更多效果请下载源码体验):

02


代码如下

一、CircularMenuItemCustomControl.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.Shapes;namespace WpfCircularMenu
{[TemplatePart(Name = RotateTransformTemplateName, Type = typeof(RotateTransform))]public class CircularMenuItemCustomControl : Control{private static readonly Type _typeofSelf = typeof(CircularMenuItemCustomControl);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(CircularMenuItemCustomControl), new UIPropertyMetadata(OnAngleChanged));private static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){CircularMenuItemCustomControl control = (CircularMenuItemCustomControl)d;control.UpdateAngle();}void UpdateAngle(){if (_angleRotateTransform == null) return;_angleRotateTransform.Angle = Angle;}public string MenuTxt{get { return (string)GetValue(MenuTxtProperty); }set { SetValue(MenuTxtProperty, value); }}public static readonly DependencyProperty MenuTxtProperty =DependencyProperty.Register("MenuTxt", typeof(string), typeof(CircularMenuItemCustomControl), 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(CircularMenuItemCustomControl), new PropertyMetadata(null));public ImageSource IconImage{get { return (ImageSource)GetValue(IconImageProperty); }set { SetValue(IconImageProperty, value); }}public static readonly DependencyProperty IconImageProperty = DependencyProperty.Register("IconImage", typeof(ImageSource), typeof(CircularMenuItemCustomControl), new PropertyMetadata(null));static CircularMenuItemCustomControl(){DefaultStyleKeyProperty.OverrideMetadata(_typeofSelf, new FrameworkPropertyMetadata(_typeofSelf));}public override void OnApplyTemplate(){base.OnApplyTemplate();_angleRotateTransform = GetTemplateChild(RotateTransformTemplateName) as RotateTransform;UpdateAngle();}}
}

二、CircularMenuItemCustomControlStyle.xaml 代码如下

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfCircularMenu"><Style TargetType="{x:Type local:CircularMenuItemCustomControl}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:CircularMenuItemCustomControl"><Grid VerticalAlignment="Center"><Grid.RenderTransform><RotateTransform x:Name="PART_RotateTransform" Angle="{TemplateBinding Angle}" CenterX="200" CenterY="200"></RotateTransform></Grid.RenderTransform><Path x:Name="PART_Path" Data="M 200,200 0,200 A 200,200 0 0 1 58.6,58.6z" Fill="{TemplateBinding BackgroundColor}" VerticalAlignment="Center"/><Image Source="{TemplateBinding IconImage}" RenderTransformOrigin="0.5,0.5"Margin="60,70,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="40" Height="40" ><Image.RenderTransform><RotateTransform Angle="-70"/></Image.RenderTransform></Image></Grid><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="true"><Setter TargetName="PART_Path" Property="Fill" Value="#009AD8"/><Setter Property="Cursor" Value="Hand"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>
</ResourceDictionary>

三、MainWindow.xaml 代码如下

<Window x:Class="WpfCircularMenu.MainWindow"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"xmlns:local="clr-namespace:WpfCircularMenu"mc:Ignorable="d"Title="MainWindow" Height="850" Width="1200"Background="Black"SnapsToDevicePixels="True" TextOptions.TextFormattingMode="Display" UseLayoutRounding="True"><Window.Resources><Storyboard x:Key="CheckedStoryboard"><DoubleAnimation Storyboard.TargetName="PART_EllipseGeometry"Storyboard.TargetProperty="RadiusX"Duration="00:00:0.4" To="200"/><DoubleAnimation Storyboard.TargetName="PART_EllipseGeometry"Storyboard.TargetProperty="RadiusY"Duration="00:00:0.4" To="200"/></Storyboard><Storyboard x:Key="UncheckedStoryboard"><DoubleAnimation Storyboard.TargetName="PART_EllipseGeometry"Storyboard.TargetProperty="RadiusX"Duration="00:00:0.3" To="0"/><DoubleAnimation Storyboard.TargetName="PART_EllipseGeometry"Storyboard.TargetProperty="RadiusY"Duration="00:00:0.3" To="0"/></Storyboard></Window.Resources><Viewbox><Grid Height="768" Width="1024"><Canvas><ItemsControl ItemsSource="{Binding MenuArray,RelativeSource={RelativeSource AncestorType=local:MainWindow}}"Canvas.Left="150" Canvas.Top="150"><ItemsControl.Clip><EllipseGeometry x:Name="PART_EllipseGeometry" RadiusX="0" RadiusY="0" Center="200,200"></EllipseGeometry></ItemsControl.Clip><ItemsControl.ItemTemplate><DataTemplate><local:CircularMenuItemCustomControl Angle="{Binding Angle}" MenuTxt="{Binding Title}" BackgroundColor="{Binding FillColor}" IconImage="{Binding IconImage}"/></DataTemplate></ItemsControl.ItemTemplate><ItemsControl.ItemsPanel><ItemsPanelTemplate><Grid/></ItemsPanelTemplate></ItemsControl.ItemsPanel></ItemsControl><ToggleButton Canvas.Left="300" Canvas.Top="300" Cursor="Hand"><ToggleButton.Template><ControlTemplate TargetType="ToggleButton"><Grid><Ellipse x:Name="PART_Ellipse" Width="100" Height="100" Fill="#009AD8" ToolTip="关闭"/><Path x:Name="PART_Path" Data="M734.618 760.269c-24.013 24.013-62.925 24.013-86.886 0l-135.731-155.136-135.731 155.085c-24.013 24.013-62.925 24.013-86.886 0-24.013-24.013-24.013-62.925 0-86.886l141.21-161.28-141.261-161.382c-24.013-24.013-24.013-62.874 0-86.886s62.874-24.013 86.886 0l135.782 155.187 135.731-155.187c24.013-24.013 62.874-24.013 86.886 0s24.013 62.925 0 86.886l-141.21 161.382 141.21 161.28c24.013 24.013 24.013 62.925 0 86.938z"Fill="White" Stretch="Fill" Width="20" Height="20" RenderTransformOrigin="0.5,0.5" IsHitTestVisible="False"></Path></Grid><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="false"><Setter TargetName="PART_Path" Property="RenderTransform"><Setter.Value><RotateTransform Angle="45"/></Setter.Value></Setter><Setter Property="ToolTip" TargetName="PART_Ellipse" Value="展开"/></Trigger></ControlTemplate.Triggers></ControlTemplate></ToggleButton.Template><ToggleButton.Triggers><EventTrigger RoutedEvent="ToggleButton.Checked"><BeginStoryboard Storyboard="{StaticResource CheckedStoryboard}"/></EventTrigger><EventTrigger RoutedEvent="ToggleButton.Unchecked"><BeginStoryboard Storyboard="{StaticResource UncheckedStoryboard}"/></EventTrigger></ToggleButton.Triggers></ToggleButton><TextBlock Text="微信公众号:WPF开发者" FontSize="40"Foreground="#A9CC32" FontWeight="Bold"Canvas.Top="50"/><Image Source="Images/gzh.png" Canvas.Left="140" Canvas.Bottom="40"/></Canvas></Grid></Viewbox>
</Window>

四、MainWindow.xaml.cs 代码如下

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfCircularMenu
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public IEnumerable MenuArray{get { return (IEnumerable)GetValue(MenuArrayProperty); }set { SetValue(MenuArrayProperty, value); }}public static readonly DependencyProperty MenuArrayProperty =DependencyProperty.Register("MenuArray", typeof(IEnumerable), typeof(MainWindow), new PropertyMetadata(null));public MainWindow(){InitializeComponent();var menuItemModels = new List<MenuItemModel>();var angle = 0;for (int i = 1; i <= 8; i++){var brushConverter = new BrushConverter();var brush = (Brush)brushConverter.ConvertFromString("#BAE766");if (IsOdd(i))brush = (Brush)brushConverter.ConvertFromString("#B0D440");menuItemModels.Add(new MenuItemModel { Angle = angle, Title = $"菜单{i}", FillColor = brush, IconImage = new BitmapImage(new Uri($"pack://application:,,,/Images/{i}.png")) });angle += 45;}MenuArray = menuItemModels;}bool IsOdd(int num){return (num % 2) == 1;}}public class MenuItemModel{public double Angle { get; set; }public string Title { get; set; }public Brush FillColor { get; set; }public ImageSource IconImage { get; set; }}
}

源码地址

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/301477.shtml

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

相关文章

win7系统桌面计算机怎么打的开,windows7系统双击计算机打不开怎么解决|win7双击计算机打不开的解决方法...

运行windows7系统的时候双击"计算机"遇到打不开的情况&#xff0c;也不知道怎么回事&#xff0c;尝试用杀毒软件解决也无效。如果要查看磁盘的具体情况&#xff0c;都没办法查看了。针对win7双击"计算机"打不开的问题&#xff0c;下面小编介绍两种解决方法…

每日一笑 | 在俄罗斯人眼里,没有什么是胶带解决不了的

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

钣金缺口lisp_UG用钣金模块的放样创建天圆地方,还能学钣金展开,必看

上个给大家用“直纹”做了一个天圆地方的圆台模型&#xff0c;今天给大家讲解下UG钣金模块如何使用“放样弯边”做天圆地方管并展开&#xff0c;借用下上次的图纸数据。首先创建天圆地方钣金模型1首先新建模型&#xff0c;点击草图&#xff0c;以XY为草图平面&#xff0c;点击确…

我开发了一款基于web容器的前端项目容器

目前使用比较多的web容器有哪些&#xff1a;Apache php应用大多数用这个Nginx node应用基本都用这个Tomcat java应用基本都用这个IIS .net应用基本用这个 windows服务器才能用 linux的话有宇内大神开发的Jexus前端基本都是node应用&#xff0c;据我了解大体上分2种一种是 最终打…

这些Python骚操作,你值得拥有

全世界只有3.14 % 的人关注了数据与算法之美0x00 世界&#xff0c;你好程序员第一次接触语言或者框架&#xff0c;基本上都有个 Hello World 的例子&#xff0c;这里 Python 直接将它做成了一个包。0x01 Python 哲学Python 执行 import this 时&#xff0c;会打印出 Python 之禅…

晨风机器人突破限制_厉害了!工程建设领域首创!会自动测量、自动调平的测量机器人...

近日中建三局工程技术研究院自主研发的道路工程移动式高精度测量机器人在武汉四环线工程完成20余公里测试应用标志着机器人完成阶段性测试具备工程应用条件道路工程移动式高精度测量机器人是一种集自动行驶、自动调平自动设站、自动测量等功能于一身的机器人系统系首次在道路工…

晕了!这个配置值从哪来的?

如果有同事问你&#xff0c;数据库连接串的值和appsettings.json配的不一样&#xff0c;从哪来的&#xff1f;你能回答的出来吗?配置读取顺序ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的&#xff0c;配置提供程序使用各种配置源从键值对读取配置数据。ASP.NET C…

client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...

艺术品作为一种兼具收藏属性和投资属性的物品&#xff0c;其最初被人们所接受的是其收藏属性。在进入二十一世纪后&#xff0c;其投资属性才逐渐显现。艺术品的双重属性增加了其投资价值&#xff0c;再叠加显著的顺周期性&#xff0c;艺术品能够在经济向好时为投资者提供超额收…

面向.NET开发人员的Dapr——分布式世界

面向.NET开发人员的Dapr——前言The world is distributed分布式世界Just ask any cool kid: Modern, distributed systems are in, and monolithic apps are out!随便问一个酷小子&#xff0c;他们都会说&#xff1a;现代、分布式系统时间已经到来&#xff0c;单体应用已经成为…

豆瓣最高评分8.1!万维钢:读懂这本书,你会比身边人更深的理解这个时代

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;这几年全球各大科技巨头纷纷进入人工智能领域&#xff0c;催生了一大批技术的…

camunda流程定义表无数据_[Python04] 学习snakemake,三步轻松搭建生信流程!

随着学习的不断深入&#xff0c;分析的数据越来越多。你会发现&#xff0c;日常生信分析不过是调用一些相同的函数或者包分析不同的数据&#xff0c;换汤不换药。那么&#xff0c;如何把分析过程流程化&#xff0c;让数据像工厂的流水线一样自动被处理&#xff1f;最简单的法子…

基于centos5.8源码安装nginx之LNMP

LNMP 指的是什么呢&#xff0c;这里可以“望文生义”&#xff0c;其是linux NGINX Mysql PHP的组合。每一种工具的安装都有其特长来吸引我们去使用它&#xff0c;对此就要了解其组合的各个工具的特点&#xff1a;Linux&#xff1a;不用多说&#xff0c;这是我们都熟知的以开…

cheatengine找不到数值_“不会找问题”,只配在底层,最高效的思维方式导图,人生开挂!...

点击右上角【关注】&#xff0c;每天获取企业经营管理秘籍&#xff01;总裁周刊&#xff0c;与您一同成长&#xff01;声明&#xff1a;文章来源于zhang_liangj&#xff0c;不代表高管周刊立场&#xff0c;如有异议&#xff0c;请私信&#xff01;文|张良计现在&#xff0c;我们…

比乐高便宜十倍!4合1电动遥控积木玩法百变

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;前几天与同事在聊天&#xff0c;他说小时候的梦想就是拥有很多很多的玩具。没…

python类库32[多线程同步Lock+RLock+Semaphore+Event]

2019独角兽企业重金招聘Python工程师标准>>> 一 多线程同步 由于CPython的python解释器在单线程模式下执行&#xff0c;所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。 python的多线程的同步与其他语言基本相同…

加个ing是什么意思_take的意思竟然是“要求”?奇奇怪怪的熟词僻义打卡终于来了!...

慢慢来&#xff0c;比较快。只要不喊停&#xff0c;我们就继续。考研人被玩坏了&#xff0c;出题人&#xff1a;只要我不承认&#xff0c;就没有人能阻止我。下面盘点一下出题人的x操作&#xff1a;2020年英语二完形&#xff1a;trying&#xff0c;乍一看是不是和“尝试”有关&…

每日一笑 | 今天是植树节,我想在你心里种点逼树

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分

如图1就是某大奖赛的选手评分情况表。在“最后得分”一项中&#xff0c;我们可以用LARGE函数或SMALL函数来计算&#xff0c;如在J3中输入下面的公式&#xff1a;AVERAGE(LARGE(B3:I3,{2,3,4,5,6,7}))即可以得到正确的结果。这里&#xff0c;我们介绍ET提供的内部平均值函数——…

Windows 程序包管理器 1.0 正式发布

在 Microsoft Build 2021 开发者大会上&#xff0c;微软正式发布 Windows Package Manager&#xff08;程序包管理器&#xff09;1.0 正式版&#xff0c;目前在 GitHub 上已有超过 1600 个程序包可供下载。Windows 程序包管理器是一个综合的程序包管理器解决方案&#xff0c;由…

围棋天才柯洁怒怼央视国际记者,用实力斩获清华大学免试资格

全世界只有3.14 % 的人关注了数据与算法之美3月10 日&#xff0c;国家体育总局发布了《2019年优秀运动员免试入学推荐名单》&#xff0c;一批在体育领域获得亮眼成就的运动员们&#xff0c;将获得中国各所高校的免试入学机会。在名单上&#xff0c;数据汪找到一个熟悉的名字——…