WPF实现统计图(饼图仿LiveCharts)

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

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

01

效果预览

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


一、PieControl.cs 代码如下 

using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using WpfPieControl.Models;namespace WpfPieControl
{public class PieControl: Control{public ObservableCollection<PieSegmentModel> PieSegmentModels{get { return (ObservableCollection<PieSegmentModel>)GetValue(PieSegmentModelsProperty); }set { SetValue(PieSegmentModelsProperty, value); }}public static readonly DependencyProperty PieSegmentModelsProperty =DependencyProperty.Register("PieSegmentModels", typeof(ObservableCollection<PieSegmentModel>), typeof(PieControl), new UIPropertyMetadata(OnPieSegmentModelChanged));private static void OnPieSegmentModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){PieControl pieControl = d as PieControl;if (e.NewValue != null){var array = e.NewValue as ObservableCollection<PieSegmentModel>;double angleNum = 0;foreach (var item in array){var color = new SolidColorBrush((Color)ColorConverter.ConvertFromString(pieControl.ColorArray[array.IndexOf(item)]));item.Color = color;item.StartAngle = angleNum;item.EndAngle = angleNum + item.Value / 100 * 360;angleNum = item.EndAngle;}}}/// <summary>/// colors/// </summary>private string[] ColorArray = new string[] { "#FDC006", "#607E89", "#2095F2", "#F34336" };/// <summary>/// 0~1/// </summary>public double ArcThickness{get { return (double)GetValue(ArcThicknessProperty); }set { SetValue(ArcThicknessProperty, value); }}public static readonly DependencyProperty ArcThicknessProperty =DependencyProperty.Register("ArcThickness", typeof(double), typeof(PieControl), new PropertyMetadata(1.0));static PieControl(){DefaultStyleKeyProperty.OverrideMetadata(typeof(PieControl), new FrameworkPropertyMetadata(typeof(PieControl)));}}
}

二、App.xaml 代码如下

<Style TargetType="{x:Type local:PieControl}"><Setter Property="UseLayoutRounding" Value="True" /><!--<Setter Property="Background" Value="#252525"/>--><Setter Property="Foreground" Value="White"/><Setter Property="Width" Value="250"/><Setter Property="Height" Value="250"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:PieControl}"><ItemsControl Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" ItemsSource="{TemplateBinding PieSegmentModels}"Background="{TemplateBinding Background}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><Grid IsItemsHost="True"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><ed:Arc Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"ArcThickness="{Binding ArcThickness,RelativeSource={RelativeSource FindAncestor,AncestorType=local:PieControl}}" ArcThicknessUnit="Percent"EndAngle="{Binding EndAngle}"StartAngle="{Binding StartAngle}"Stretch="None"ToolTip="{Binding Name}"Stroke="{Binding ColorStroke}"StrokeThickness="2"Fill="{Binding Color}"></ed:Arc></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ControlTemplate></Setter.Value></Setter>
</Style>

三、MainWindow.xaml 代码如下

<Window x:Class="WpfPieControl.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:WpfPieControl"mc:Ignorable="d"Title="微信公众号:WPF开发者" Height="450" Width="800"><StackPanel><WrapPanel Margin="10"><local:PieControl PieSegmentModels="{Binding PieSegmentModels,RelativeSource={RelativeSource AncestorType=local:MainWindow}}" ArcThickness="1"/><local:PieControl PieSegmentModels="{Binding PieSegmentModels,RelativeSource={RelativeSource AncestorType=local:MainWindow}}" Margin="4,0"ArcThickness="{Binding ElementName=PRAT_Slider,Path=Value}"/><local:PieControl PieSegmentModels="{Binding PieSegmentModels,RelativeSource={RelativeSource AncestorType=local:MainWindow}}" ArcThickness="0.65"/></WrapPanel><Slider Maximum="0.9" Minimum="0.1" x:Name="PRAT_Slider" Margin="10" Width="200"/><Button Content="更新" Click="Button_Click" VerticalAlignment="Bottom" Width="200"/></StackPanel>
</Window>

四、MainWindow.xaml.cs 代码如下

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
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;
using WpfPieControl.Models;namespace WpfPieControl
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public ObservableCollection<PieSegmentModel> PieSegmentModels{get { return (ObservableCollection<PieSegmentModel>)GetValue(PieSegmentModelsProperty); }set { SetValue(PieSegmentModelsProperty, value); }}public static readonly DependencyProperty PieSegmentModelsProperty =DependencyProperty.Register("PieSegmentModels", typeof(ObservableCollection<PieSegmentModel>), typeof(MainWindow), new PropertyMetadata(null));List<ObservableCollection<PieSegmentModel>> collectionList = new List<ObservableCollection<PieSegmentModel>>();public MainWindow(){InitializeComponent();PieSegmentModels = new ObservableCollection<PieSegmentModel>();var collection1 = new ObservableCollection<PieSegmentModel>();collection1.Add(new PieSegmentModel { Name = "一", Value = 10 });collection1.Add(new PieSegmentModel { Name = "二", Value = 20 });collection1.Add(new PieSegmentModel { Name = "三", Value = 25 });collection1.Add(new PieSegmentModel { Name = "四", Value = 45 });var collection2 = new ObservableCollection<PieSegmentModel>();collection2.Add(new PieSegmentModel { Name = "一", Value = 30 });collection2.Add(new PieSegmentModel { Name = "二", Value = 15 });collection2.Add(new PieSegmentModel { Name = "三", Value = 10 });collection2.Add(new PieSegmentModel { Name = "四", Value = 55 });collectionList.AddRange(new[] { collection1, collection2 });PieSegmentModels = collectionList[0];}bool isRefresh = false;private void Button_Click(object sender, RoutedEventArgs e){if (!isRefresh)PieSegmentModels = collectionList[1];elsePieSegmentModels = collectionList[0];isRefresh = !isRefresh;}}
}

源码地址

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

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

相关文章

计算机实践教程采莲趣事,计算机基础作业采莲趣事

精品文档 . 忽然想起采莲的事情来了。采莲是江南的旧俗&#xff0c;似乎很早就有&#xff0c;而六朝时为盛&#xff1b;从诗歌里可以约略知道。采莲的是少年的女子&#xff0c;她们是荡着小船&#xff0c;唱着艳歌去的。采莲人不用说很多&#xff0c;还有看采莲的人。那是一个热…

那些曾经拥有的最大快乐,都是好奇心的结果

▲ 点击查看对于孩子们来说&#xff0c;强烈的好奇心和求知欲&#xff0c;是一种本能。在他们懵懵懂懂长大的过程中&#xff0c;总是对周围的世界充满着各种各样的疑问&#xff1a;“叶子为什么是绿色的&#xff1f;”“为什么花朵有那么多种颜色&#xff1f;”“蚂蚁为什么能…

[原]让链接点击过后无虚线

我以前还以为有难呢,在网上查资料,才知道这么简单, <a href"http://www.ktbbs.com"onfocus"this.blur()">转载于:https://www.cnblogs.com/Kennytian/archive/2007/03/31/695463.html

UML简易实践

2019独角兽企业重金招聘Python工程师标准>>> 面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML&#xff08;也就是Unified Modeling Language™&#xff09;&#xff0c;这篇课程的目的是展示出UML的精…

战斗机各种世界之最,涨知识了。。。

全世界只有3.14 % 的人关注了青少年数学之旅世界上最大的战斗机苏联的图-128是目前世界上起飞重量最大&#xff0c;体积最大的一款截击机&#xff0c;它由前苏联图波列夫设计局于1955研制成功并进行首飞&#xff0c;1963年装备部队&#xff0c;该机全长30.03米&#xff0c;翼展…

Bye Bye Embed-再见了Embed,符合web标准的媒体播放器代码

由于Embed标签是Netscape的私有财产&#xff0c;故一直未被W3C认可&#xff0c;对于各种媒体文件使用Embed标签是非标准的&#xff0c;如何改变&#xff1f;Elizabeth Castro的 Bye Bye Embed 一文对于各种媒体播放器给出了很好的符合web标准的代码。 在线媒体播放--Google Vid…

.NET Core授权失败如何自定义响应信息?

【导读】在.NET 5之前&#xff0c;当授权失败即403时无法很友好的自定义错误信息&#xff0c;以致于比如利用Vue获取到的是空响应&#xff0c;不能很好的处理实际业务&#xff0c;同时涉及到权限粒度控制到控制器、Action&#xff0c;也不能很好的获取对应路由信息本文我们来看…

计算机电缆2x2x1.5,计算机电缆djypvp1x2x1.5

计算机电缆djypvp1x2x1.5硅橡胶计算机电缆适用于各种仪器仪表的连结&#xff0c; 以及信号传输。它具有耐高温、低温、耐腐蚀、舒缓老化等优点&#xff0c;对特殊场所或恶劣环境中的使用是目前理想的产品&#xff0c;正常使用温度为—60℃一250℃。产品特点:1.执行标准Q/ILXD-1…

虚线 实现_redis跳跃表实现

跳跃表是一种有序的数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。redis 使用跳跃表作为有序集合键的底层实现之一&#xff0c;如果一个有序集合包含的元素数量比较多&#xff0c;又或者有序集合中元素的成员是比…

当代家长现状。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源都市音酱&#xff09;太真实了↓ ↓ ↓

Prometheus(一):Web服务环境监控

&#xfeff;写在前面现每个后端的同学的日常都在跟服务(接口)打交道&#xff0c;维护老的比较大单体应用、按业务拆得相对比较细的新服务、无论企业内部用的&#xff0c;面向用户的前端的服务。流量大的有流量小的&#xff0c;有重要的有不那么重要的。但是&#xff0c;不管怎…

acwing Linux 租云服务器环境配置

今天给大家讲解acwing Linux 租云服务器&环境配置&#xff0c;这里以阿里云为例子给大家讲解一下如何租用这个云服务器&#xff0c;现在有阿里云、华为云、腾讯云、京东云这么几个大的服务系统&#xff0c;我个人是喜欢华为云的嘻嘻&#xff0c;因为个人比较喜欢华为公司&a…

Shell练习题(持续更新)

1.输出1-10echo {1..10} seq -s 1 10 #默认分隔符\n for((i1;i<10;i));do echo -n "$i ";done;echo #最后echo为了换行 i1;while [ $i -le 10 ];do printf "%s " $i;i$[$i1];done;echo awk BEGIN{for(i1;i<10;i) printf "%s ",i;};…

楼层效果_1一28高楼最好最吉利的楼层是哪层?选楼层要注意什么?

在选择房屋楼层的时候&#xff0c;可能大家对于想过了&#xff0c;方法是比较纠结的&#xff0c;有些家庭可能考虑到室内的采光问题&#xff0c;有些可能考虑的是噪音的问题&#xff0c;更有些朋友们可能考虑的是室内的风水等相关问题&#xff0c;那么1一28高楼最好最吉利的楼层…

43秒处竟惊现刘强东!印度动作大片《WAR》终极预告曝光

全世界只有3.14 % 的人关注了青少年数学之旅都说印度是一个非常奇妙的国度&#xff0c;文能Z教治国&#xff0c;武能高产神片。科学家们骂骂咧咧地退出了群聊...这不&#xff0c;前不久印度又曝光了一部动作大片《WAR》&#xff1a;电影的剧情大概是讲述了一名印度士兵被派去消…

按id进行查找按名称进行排序_Excel工作表中如何按需要的顺序快速进行排序

在工作中&#xff0c;有时候需要经常对一组内容按一定的顺序来进行排序。如果每次都手动进行排序&#xff0c;会小号很多时间。因此可以将特定顺序添加到自定义序列中。有两种不同的操作方法可以来实现。方法一如图&#xff0c;现在有一列水果名称&#xff0c;之后需要都按照现…

20种最先进的机器人,感觉有点吓人!

全世界只有3.14 % 的人关注了青少年数学之旅随着科技的发展&#xff0c;机器人必然逐渐进入我们的生活&#xff0c;甚至在许多领域替代人类。以下是目前全球范围内最先进的一些机器人&#xff1a;Actroid-F这种实验性机器人的目标&#xff0c;是创造最逼真的仿人类机器人&#…

PDF批量删除注释

使用Adobe Acrobat Pro的批量处理完成 1.在“自定义”-“添加新工具集”-“动作向导”-将“创建新动作”加入-“保存”2.然后点新出现的“创建新动作”图标3.将“内容”-“删除所有注释”添加上&#xff0c;然后再添加上“保存和导出”中的保存4.保存设定的动作列表&#xff0c…

怎么让图片手机上排列_荣耀手机系列档次怎么排列?

目前&#xff0c;我们按照处理器和手机表现进行排列。荣耀magic2因为充电口(塑料问题)&#xff0c;所以&#xff0c;排名第一的位置我给荣耀V20&#xff01;其次&#xff0c;是荣耀magic2&#xff0c;然后是荣耀10&#xff0c;荣耀note10&#xff0c;其次是荣耀v10&#xff0c;…

金蝶显示服务器异常,金蝶提示云服务器异常

金蝶提示云服务器异常 内容精选换一换生命周期是指弹性云服务器从创建到删除(或释放)历经的各种状态。当云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等场景均可能导致云服务器无法正常登录。当您的云服务器无法远程登录时&#xff0c;我们建议您首先…