本段代碼是一個封裝的用戶控件
<UserControl x:Class="YF_Frame.PerformanceMonitor"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" ><lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Right" Background="{DynamicResource BackgroundBrush}" Foreground="{DynamicResource TextBrush}"><lvc:CartesianChart.AxisY><lvc:Axis Title="使用率 (%)" LabelFormatter="{Binding YFormatter}" MinValue="0" MaxValue="100" Foreground="{DynamicResource TextBrush}"></lvc:Axis></lvc:CartesianChart.AxisY><lvc:CartesianChart.AxisX><lvc:Axis Title="時間" Labels="{Binding Labels}" Foreground="{DynamicResource TextBrush}"></lvc:Axis></lvc:CartesianChart.AxisX></lvc:CartesianChart>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 LiveCharts.Defaults;
using LiveCharts.Wpf;
using LiveCharts;
using System.Management;
using System.Diagnostics;
using System.Windows.Threading;
using System.ComponentModel;namespace YF_Frame
{/// <summary>/// PerformanceMonitor.xaml 的交互邏輯/// </summary>public partial class PerformanceMonitor : UserControl, INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}public SeriesCollection SeriesCollection { get; set; }public string[] Labels { get; set; }public Func<double, string> YFormatter { get; set; }private PerformanceCounter cpuCounter;private PerformanceCounter ramCounter;public PerformanceMonitor(){InitializeComponent();SeriesCollection = new SeriesCollection{new LineSeries{Title = "CPU",Values = new ChartValues<ObservableValue>{new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0)},PointGeometry = DefaultGeometries.Circle,PointGeometrySize = 10},new LineSeries{Title = "內存",Values = new ChartValues<ObservableValue>{new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0),new ObservableValue(0)},PointGeometry = DefaultGeometries.Square,PointGeometrySize = 10}}; Labels = new[] { "1分鐘前", "50秒前", "40秒前", "30秒前", "20秒前", "現在" };YFormatter = value => value.ToString("N0");DataContext = this;// 初始化CPU計數器(全局CPU使用率)cpuCounter = new PerformanceCounter("Processor", // 類別(處理器)"% Processor Time", // 計數器名稱(CPU時間百分比)"_Total" // 實例名稱(_Total表示所有核心));// 初始化內存計數器(可用內存百分比)ramCounter = new PerformanceCounter("Memory", // 類別(內存)"Available MBytes" // 計數器名稱(可用內存MB));// 啟動定時器刷新數據(每1秒更新一次)DispatcherTimer timer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(5);timer.Tick += UpdatePerformanceData;timer.Start();}private void UpdatePerformanceData(object sender, EventArgs e){try{// 獲取CPU使用率(取當前值)float cpuUsage = cpuCounter.NextValue();// 獲取可用內存(MB)float availableMemoryMB = ramCounter.NextValue();// 計算已用內存(假設總內存16GB,你可以替換為實際值)float totalMemoryMB = 16 * 1024; // 16GB = 16 * 1024 MBfloat usedMemoryMB = totalMemoryMB - availableMemoryMB;float memoryUsagePercent = (usedMemoryMB / totalMemoryMB) * 100;// 更新圖表數據UpdateChartData(cpuUsage, memoryUsagePercent);// 更新標簽(可選:顯示最新數據)Labels = new[] { "25秒前", "20秒前", "15秒前", "10秒前", "5秒前", "現在" };OnPropertyChanged(nameof(Labels)); // 通知UI更新}catch (Exception ex){// 由于 Windows 性能計數器損壞 => cmd lodctr / R}}private void UpdateChartData(float cpuUsage, float memoryUsage){// 獲取當前CPU和內存的數據序列var cpuSeries = SeriesCollection[0].Values as ChartValues<ObservableValue>;var memorySeries = SeriesCollection[1].Values as ChartValues<ObservableValue>;// 移除最舊的數據點(保持6個數據點)if (cpuSeries.Count >= 6){cpuSeries.RemoveAt(0);memorySeries.RemoveAt(0);}// 添加新的數據點cpuSeries.Add(new ObservableValue(cpuUsage));memorySeries.Add(new ObservableValue(memoryUsage));}}
}