WPF仿LiveCharts實(shí)現(xiàn)餅圖的繪制
每日一笑
下班和實(shí)習(xí)生一起回家,公交站等車(chē),一乞丐把碗推向?qū)嵙?xí)生乞討。這時(shí),實(shí)習(xí)生不慌不忙的說(shuō)了句:“我不要你的錢(qián),你這錢(qián)來(lái)的也不容易。”
前言
有小伙伴需要統(tǒng)計(jì)圖。
效果預(yù)覽(更多效果請(qǐng)下載源碼體驗(yàn))
一、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="微信公眾號(hào):WPF開(kāi)發(fā)者" 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; } } }
到此這篇關(guān)于WPF仿LiveCharts實(shí)現(xiàn)餅圖的繪制的文章就介紹到這了,更多相關(guān)WPF餅圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入多線程之:雙向信號(hào)與競(jìng)賽的用法分析
本篇文章是對(duì)雙向信號(hào)與競(jìng)賽的用法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05操作XML文檔遇到的XMLNS問(wèn)題及解決方法 (C# 和 PHP)
不管是用 PHP 還是 C#, 在操作 XML 的時(shí)候我們除了一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)去取值之外, 還有一個(gè)非常方便的表達(dá)式, 就是 XPATH2011-05-05asp.net新聞列表生成靜態(tài)頁(yè)之批量和單頁(yè)生成
web程序的高訪問(wèn)量、大數(shù)據(jù)量、高效的用戶體驗(yàn)度,使靜態(tài)頁(yè)技術(shù)在越來(lái)越多的網(wǎng)站上發(fā)揮作用。這篇文章主要介紹asp.net新聞列表生成靜態(tài)頁(yè)之批量和單頁(yè)生成,有需要的朋友可以參考下2015-08-08使用C#實(shí)現(xiàn)讀取PDF中所有文本內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)讀取PDF中所有文本內(nèi)容,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,有需要的小伙伴可以了解下2024-02-02c#生成站點(diǎn)地圖(SiteMapPath)文件示例程序
這篇文章主要介紹了c#生成站點(diǎn)地圖(SiteMapPath)文件的示例,大家參考使用2013-11-11