WPF中轻松生成动态图表:实例详解(MVVM模式)

  • WPF中轻松生成动态图表:实例详解(MVVM模式)已关闭评论
  • 34 次浏览
  • A+
所属分类:.NET技术
摘要

 概述: 本文代码示例演示了如何在WPF中使用LiveCharts库创建动态条形图。通过创建数据模型、ViewModel和在XAML中使用`CartesianChart`控件,你可以轻松实现图表的数据绑定和动态更新。我将通过清晰的步骤指南包括详细的中文注释,帮助你快速理解并应用这一功能。

WPF中轻松生成动态图表:实例详解(MVVM模式)

 

概述:本文代码示例演示了如何在WPF中使用LiveCharts库创建动态条形图。通过创建数据模型、ViewModel和在XAML中使用`CartesianChart`控件,你可以轻松实现图表的数据绑定和动态更新。我将通过清晰的步骤指南包括详细的中文注释,帮助你快速理解并应用这一功能。

先上效果:

WPF中轻松生成动态图表:实例详解(MVVM模式)

 

在WPF中使用LiveCharts生成动态的条形图表需要以下步骤。以下是详细的实例源代码:

步骤 1: 引用LiveCharts库

首先,在项目中引用LiveCharts库。你可以通过NuGet包管理器来安装LiveCharts.Wpf:

Install-Package LiveCharts.Wpf

步骤 2: 创建WPF项目

创建一个新的WPF项目,确保已经在XAML文件中引用了LiveCharts的命名空间:

xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"

步骤 3: 创建数据模型

创建一个数据模型,用于存储条形图的数据:

// BarChartData.cs public class BarChartData {     public string Category { get; set; }     public double Value { get; set; } }

步骤 4: 创建ViewModel

创建一个ViewModel类,用于处理图表的数据和逻辑。在这个类中,你将生成数据并将其绑定到图表控件:

public partial class ViewModel : ViewModelBase {     private readonly Random _r = new();     private static readonly (string, double)[] s_initialData =     {         ("上海", 500),         ("北京", 450),         ("深圳", 520),         ("广州", 550),         ("重庆", 660),         ("天津", 920),         ("成都", 1000)     };      [ObservableProperty]     private ISeries[] _series =         s_initialData             .Select(x => new RowSeries<ObservableValue>             {                 Values = new[] { new ObservableValue(x.Item2) },                 Name = x.Item1,                 Stroke = null,                 MaxBarWidth = 25,                 DataLabelsPaint = new SolidColorPaint(new SKColor(245, 245, 245)),                 DataLabelsPosition = DataLabelsPosition.End,                 DataLabelsTranslate = new LvcPoint(-1, 0),                 DataLabelsFormatter = point => $"{point.Context.Series.Name} {point.PrimaryValue}"             })             .OrderByDescending(x => ((ObservableValue[])x.Values!)[0].Value)             .ToArray();      [ObservableProperty]     private Axis[] _xAxes = { new Axis { SeparatorsPaint = new SolidColorPaint(new SKColor(220, 220, 220)) } };      [ObservableProperty]     private Axis[] _yAxes = { new Axis { IsVisible = false } };      /// <summary>     /// 动态修改数据,实际项目中读取真实数据     /// </summary>     public void RandomIncrement()     {         foreach (var item in Series)         {             if (item.Values is null) continue;              var i = ((ObservableValue[])item.Values)[0];             i.Value += _r.Next(0, 100);         }         //对新数据重新排序         Series = Series.OrderByDescending(x => ((ObservableValue[])x.Values!)[0].Value).ToArray();     } }

步骤 5: 在XAML中使用图表控件

在XAML中使用LiveCharts的 CartesianChart 控件来显示条形图:

<!-- MainWindow.xaml --> <Window x:Class="Sample_Charts_Bars.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:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF"         xmlns:local="clr-namespace:Sample_Charts_Bars"         mc:Ignorable="d"         Title="MainWindow" Height="450" Width="800">     <Window.DataContext>         <local:ViewModel/>     </Window.DataContext>     <Grid>         <Grid.RowDefinitions>             <RowDefinition Height="*"/>         </Grid.RowDefinitions>         <lvc:CartesianChart Title="{Binding Title}"              Series="{Binding Series}"             XAxes="{Binding XAxes}"             YAxes="{Binding YAxes}"             TooltipPosition="Hidden">         </lvc:CartesianChart>     </Grid> </Window>

步骤 6: 在MainWindow中设置DataContext

在MainWindow.xaml.cs中设置ViewModel的DataContext,以便数据绑定:

// MainWindow.xaml.cs using System.Windows;  namespace YourNamespace {     public partial class MainWindow : Window     {         public MainWindow()         {             InitializeComponent();             Update();         }          public async void Update()         {             var vm = (ViewModel)DataContext;             while (true)             {                 //更新数据                 Application.Current.Dispatcher.Invoke(vm.RandomIncrement);                 await Task.Delay(100);             }         }     } }

需要查看更多实例请关注我,后面将逐个发布。

源代码获取:https://pan.baidu.com/s/1EtHg5dvB7ZEQDI9Y3VICpw?pwd=6666

 

WPF中轻松生成动态图表:实例详解(MVVM模式)