WPF仿LiveCharts实现饼图的绘制

目录

前言 

一、PieControl.cs

二、App.xaml

三、MainWindow.xaml

四、MainWindow.xaml.cs

每日一笑

下班和实习生一起回家,公交站等车,一乞丐把碗推向实习生乞讨。这时,实习生不慌不忙的说了句:“我不要你的钱,你这钱来的也不容易。” 

前言 

有小伙伴需要统计图。

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

一、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]; else PieSegmentModels = collectionList[0]; isRefresh = !isRefresh; } } }

到此这篇关于WPF仿LiveCharts实现饼图的绘制的文章就介绍到这了,更多相关WPF饼图内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    excel表怎么制作复合饼图 excel表制作复合饼图方法

    excel表怎么制作复合饼图 excel表制作复合饼图方法,数据,饼图,图表,设置,复合,标签,  在分类较多的情况下,使用单独的饼图容易使图表显得凌乱,

    wpf快捷键设置|wpf 右键菜单

    wpf快捷键设置|wpf 右键菜单,,wpf快捷键设置1.如果点击启动游戏后,游戏窗口弹不出来,可以尝试把客户端(连同配置一起)完全删除,重新下载客户端

    excel如何制作圆饼图形

    excel如何制作圆饼图形,数据,设置,选择,喜欢,右键,制作,  在excel中,有时表格不能够那么一目了然地了解数据之间的关系,我们喜欢用更直观的图例

    wpa隐藏快捷键|wpf快捷键设置

    wpa隐藏快捷键|wpf快捷键设置,,1. wpf快捷键设置1.如果点击启动游戏后,游戏窗口弹不出来,可以尝试把客户端(连同配置一起)完全删除,重新下载客

    在 WPF 中使用 SQLite

    在 WPF 中使用 SQLite,配置文件,代码, 对于一般的WINFORM或者WEB程序,网上已经有了解决方案:只需要在应用程序配置文件configuration节点加

    制作wps有底图|wps中绘制圆饼图

    制作wps有底图|wps中绘制圆饼图,有底,制作,wps,1.wps中如何绘制圆饼图1、先利用WPS表格制作一个二维表,列上依次为“顾客类型”、“人数”

    wps复合图表|WPS做复合饼图应该操作

    wps复合图表|WPS做复合饼图应该操作,图表,复合,wps,1.WPS做复合饼图应该怎么操作运行WPS软件,点击【表格】,然后点击【新建空白文档】,新建一

    wpf界面风格|wp风格主题

    wpf界面风格|wp风格主题,,1. wpf界面风格wpf释义:abbr. 用于为不同用户界面提供统一的显示系统( Windows Presentation Foundation)例句:WPF i

    饼图设置动画效果|饼图动态效果

    饼图设置动画效果|饼图动态效果,,饼图设置动画效果简单,具体步骤:萊垍頭條1、选中饼图→右键→组合→取消组合→出现警告提示→选择“是”→