From 51233502d1449a7316aa3717ab9e05ce38ff5cd0 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 15:33:15 +0200 Subject: [PATCH 1/8] Feature: Migrate to LiveCharts2 --- .../BandwidthBytesToSpeedConverter.cs | 20 +- .../BandwidthBytesWithSizeConverter.cs | 19 -- .../LvlChartsBandwidthValueConverter.cs | 29 -- .../DocumentationManager.cs | 1 + .../GlobalStaticConfiguration.cs | 1 + .../NETworkManager.Settings/SettingsInfo.cs | 16 + .../NETworkManager.Settings/SettingsName.cs | 1 + .../SettingsViewManager.cs | 2 + .../Controls/LiveChartsBandwidthTooltip.xaml | 46 +++ .../LiveChartsBandwidthTooltip.xaml.cs | 94 +++++ .../Controls/LvlChartsBandwidthTooltip.xaml | 48 --- .../LvlChartsBandwidthTooltip.xaml.cs | 35 -- .../NetworkInterfaceSettingsViewModel.cs | 55 +++ .../ViewModels/NetworkInterfaceViewModel.cs | 320 +++++++++++++++--- .../ViewModels/SettingsViewModel.cs | 6 + .../Views/NetworkInterfaceSettingsView.xaml | 17 + .../NetworkInterfaceSettingsView.xaml.cs | 14 + .../Views/NetworkInterfaceView.xaml | 99 ++++-- 18 files changed, 617 insertions(+), 206 deletions(-) delete mode 100644 Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs delete mode 100644 Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs create mode 100644 Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml create mode 100644 Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml.cs delete mode 100644 Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml delete mode 100644 Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml.cs create mode 100644 Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs create mode 100644 Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml create mode 100644 Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs diff --git a/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs b/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs index 6288cc1d1d..1f6d2a02cf 100644 --- a/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs +++ b/Source/NETworkManager.Converters/BandwidthBytesToSpeedConverter.cs @@ -1,21 +1,31 @@ -using System; +using System; using System.Globalization; using System.Windows.Data; using NETworkManager.Utilities; namespace NETworkManager.Converters; +/// +/// Converts a byte-per-second value to a human-readable speed string. +/// Pass the converter parameter "bytes" to format as byte/s (e.g. "1.54 MB/s"); +/// any other value (default) formats as bit/s (e.g. "12.3 Mbit/s") to match the chart axis. +/// public sealed class BandwidthBytesToSpeedConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - return value != null - ? $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s ({FileSizeConverter.GetBytesReadable((long)value)}/s)" - : "-/-"; + if (value == null) + return "-/-"; + + var bytesPerSecond = (long)value; + + return parameter as string == "bytes" + ? $"{FileSizeConverter.GetBytesReadable(bytesPerSecond)}/s" + : $"{FileSizeConverter.GetBytesReadable(bytesPerSecond * 8)}it/s"; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } -} \ No newline at end of file +} diff --git a/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs b/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs deleted file mode 100644 index 114095183c..0000000000 --- a/Source/NETworkManager.Converters/BandwidthBytesWithSizeConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Utilities; - -namespace NETworkManager.Converters; - -public sealed class BandwidthBytesWithSizeConverter : IValueConverter -{ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null ? $"{(long)value} ({FileSizeConverter.GetBytesReadable((long)value)})" : "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs b/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs deleted file mode 100644 index a2a9f6b09d..0000000000 --- a/Source/NETworkManager.Converters/LvlChartsBandwidthValueConverter.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using NETworkManager.Utilities; - -namespace NETworkManager.Converters; - -public sealed class LvlChartsBandwidthValueConverter : IValueConverter -{ - /// - /// - /// ChartPoint.Instance (object) - /// - /// - /// - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is LvlChartsDefaultInfo info) - return $"{FileSizeConverter.GetBytesReadable((long)info.Value * 8)}it/s"; - - return "-/-"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/DocumentationManager.cs b/Source/NETworkManager.Documentation/DocumentationManager.cs index 6347394f27..f1631e0a45 100644 --- a/Source/NETworkManager.Documentation/DocumentationManager.cs +++ b/Source/NETworkManager.Documentation/DocumentationManager.cs @@ -255,6 +255,7 @@ public static DocumentationIdentifier GetIdentifierBySettingsName(SettingsName n SettingsName.Profiles => DocumentationIdentifier.SettingsProfiles, SettingsName.Settings => DocumentationIdentifier.SettingsSettings, SettingsName.Dashboard => GetIdentifierByApplicationName(ApplicationName.Dashboard), + SettingsName.NetworkInterface => GetIdentifierByApplicationName(ApplicationName.NetworkInterface), SettingsName.IPScanner => GetIdentifierByApplicationName(ApplicationName.IPScanner), SettingsName.PortScanner => GetIdentifierByApplicationName(ApplicationName.PortScanner), SettingsName.PingMonitor => GetIdentifierByApplicationName(ApplicationName.PingMonitor), diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index 30df1a5117..0252eb58a4 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -104,6 +104,7 @@ public static class GlobalStaticConfiguration // Application: Network Interface public static ExportFileType NetworkInterface_ExportFileType => ExportFileType.Csv; + public static int NetworkInterface_BandwidthChartTime => 60; // Application: WiFi public static bool WiFi_Show2dot4GHzNetworks => true; diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs index 09a73eccb0..ffbcdc1f37 100644 --- a/Source/NETworkManager.Settings/SettingsInfo.cs +++ b/Source/NETworkManager.Settings/SettingsInfo.cs @@ -894,6 +894,22 @@ public ExportFileType NetworkInterface_ExportFileType } } = GlobalStaticConfiguration.NetworkInterface_ExportFileType; + /// + /// Gets or sets the bandwidth chart time window in seconds. + /// + public int NetworkInterface_BandwidthChartTime + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.NetworkInterface_BandwidthChartTime; + #endregion #region WiFi diff --git a/Source/NETworkManager.Settings/SettingsName.cs b/Source/NETworkManager.Settings/SettingsName.cs index 949de02c75..e54842d6c2 100644 --- a/Source/NETworkManager.Settings/SettingsName.cs +++ b/Source/NETworkManager.Settings/SettingsName.cs @@ -14,6 +14,7 @@ public enum SettingsName Profiles, Settings, Dashboard, + NetworkInterface, IPScanner, PortScanner, PingMonitor, diff --git a/Source/NETworkManager.Settings/SettingsViewManager.cs b/Source/NETworkManager.Settings/SettingsViewManager.cs index 08950281ac..7843409dff 100644 --- a/Source/NETworkManager.Settings/SettingsViewManager.cs +++ b/Source/NETworkManager.Settings/SettingsViewManager.cs @@ -48,6 +48,8 @@ public static class SettingsViewManager // Applications new(SettingsName.Dashboard, ApplicationManager.GetIcon(ApplicationName.Dashboard), SettingsGroup.Application), + new(SettingsName.NetworkInterface, ApplicationManager.GetIcon(ApplicationName.NetworkInterface), + SettingsGroup.Application), new(SettingsName.IPScanner, ApplicationManager.GetIcon(ApplicationName.IPScanner), SettingsGroup.Application), new(SettingsName.PortScanner, ApplicationManager.GetIcon(ApplicationName.PortScanner), diff --git a/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml b/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml new file mode 100644 index 0000000000..0d03d5e0e2 --- /dev/null +++ b/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml.cs b/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml.cs new file mode 100644 index 0000000000..85abf5f6b4 --- /dev/null +++ b/Source/NETworkManager/Controls/LiveChartsBandwidthTooltip.xaml.cs @@ -0,0 +1,94 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Windows; +using System.Windows.Controls.Primitives; +using System.Windows.Media; +using LiveChartsCore; +using LiveChartsCore.Kernel; +using LiveChartsCore.Kernel.Sketches; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using NETworkManager.Utilities; +using SkiaSharp; + +namespace NETworkManager.Controls; + +public partial class LiveChartsBandwidthTooltip : IChartTooltip, INotifyPropertyChanged +{ + private readonly Popup _popup; + + public LiveChartsBandwidthTooltip() + { + InitializeComponent(); + DataContext = this; + _popup = new Popup + { + AllowsTransparency = true, + Placement = PlacementMode.MousePoint, + StaysOpen = true, + Child = this + }; + } + + public event PropertyChangedEventHandler PropertyChanged; + + public string HeaderText + { + get; + private set + { + if (field == value) return; + field = value; + OnPropertyChanged(); + } + } + + public ObservableCollection TooltipEntries { get; } = []; + + public void Show(IEnumerable tooltipPoints, Chart chart) + { + var points = tooltipPoints.ToList(); + if (points.Count == 0) return; + + if (points[0].Context.DataSource is LvlChartsDefaultInfo firstInfo) + HeaderText = DateTimeHelper.DateTimeToTimeString(firstInfo.DateTime); + + TooltipEntries.Clear(); + foreach (var point in points) + { + var value = point.Context.DataSource is LvlChartsDefaultInfo info + ? $"{FileSizeConverter.GetBytesReadable((long)info.Value * 8)}it/s" + : "-/-"; + TooltipEntries.Add(new TooltipEntry( + SkColorToBrush(GetSeriesColor(point)), + value, + point.Context.Series.Name ?? string.Empty)); + } + + _popup.PlacementTarget = chart.View as FrameworkElement; + _popup.IsOpen = true; + } + + public void Hide(Chart chart) + { + _popup.IsOpen = false; + } + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + + private static SKColor GetSeriesColor(ChartPoint point) + { + if (point.Context.Series is LineSeries ls && ls.Stroke is SolidColorPaint paint) + return paint.Color; + return SKColors.Gray; + } + + private static Brush SkColorToBrush(SKColor color) + => new SolidColorBrush(Color.FromArgb(color.Alpha, color.Red, color.Green, color.Blue)); + + public record TooltipEntry(Brush SeriesColor, string Value, string SeriesName); +} diff --git a/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml b/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml deleted file mode 100644 index 8542c1077a..0000000000 --- a/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml.cs b/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml.cs deleted file mode 100644 index 916a23bcc3..0000000000 --- a/Source/NETworkManager/Controls/LvlChartsBandwidthTooltip.xaml.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; -using LiveCharts; -using LiveCharts.Wpf; - -namespace NETworkManager.Controls; - -public partial class LvlChartsBandwidthTooltip : IChartTooltip -{ - public LvlChartsBandwidthTooltip() - { - InitializeComponent(); - - DataContext = this; - } - - public event PropertyChangedEventHandler PropertyChanged; - - public TooltipData Data - { - get; - set - { - field = value; - OnPropertyChanged(); - } - } - - public TooltipSelectionMode? SelectionMode { get; set; } - - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } -} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs new file mode 100644 index 0000000000..d3ad329b21 --- /dev/null +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs @@ -0,0 +1,55 @@ +using NETworkManager.Settings; + +namespace NETworkManager.ViewModels; + +/// +/// Represents the settings for the Network Interface. +/// +public class NetworkInterfaceSettingsViewModel : ViewModelBase +{ + #region Variables + + private readonly bool _isLoading; + + /// + /// Gets or sets the bandwidth chart time window in seconds. + /// + public int BandwidthChartTime + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.NetworkInterface_BandwidthChartTime = value; + + field = value; + OnPropertyChanged(); + } + } + + #endregion + + #region Contructor, load settings + + /// + /// Initializes a new instance of the class. + /// + public NetworkInterfaceSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + + _isLoading = false; + } + + private void LoadSettings() + { + BandwidthChartTime = SettingsManager.Current.NetworkInterface_BandwidthChartTime; + } + + #endregion +} diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index 1c265f963e..97d478737f 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -1,6 +1,9 @@ -using LiveCharts; -using LiveCharts.Configurations; -using LiveCharts.Wpf; +using LiveChartsCore; +using LiveChartsCore.Drawing; +using LiveChartsCore.Kernel; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using LiveChartsCore.SkiaSharpView.Painting.Effects; using log4net; using MahApps.Metro.Controls; using MahApps.Metro.SimpleChildWindow; @@ -14,6 +17,7 @@ using NETworkManager.Settings; using NETworkManager.Utilities; using NETworkManager.Views; +using SkiaSharp; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -716,44 +720,187 @@ public NetworkInterfaceViewModel() NetworkChange.NetworkAvailabilityChanged += (_, _) => ReloadNetworkInterfaces(); NetworkChange.NetworkAddressChanged += (_, _) => ReloadNetworkInterfaces(); + // React to settings changes (e.g. the configurable bandwidth chart time window) + SettingsManager.Current.PropertyChanged += SettingsManager_PropertyChanged; + LoadSettings(); _isLoading = false; } /// - /// Initializes the bandwidth chart configuration. + /// The visible chart time window in seconds, configurable via the settings. + /// + private static double BandwidthChartWindowSeconds => SettingsManager.Current.NetworkInterface_BandwidthChartTime; + + /// + /// Extra share of samples kept beyond the visible window so the chart has a little + /// off-screen history (smoother left edge while live + minor pan-back headroom). /// + private const double BandwidthValuesHeadroom = 1.1; + + private int _maxBandwidthValues; + private bool _updatingBandwidthAxisFromCode; + private DateTime _bandwidthSessionStartTime; + + private ObservableCollection _bandwidthReceivedValues; + private ObservableCollection _bandwidthSentValues; + + // Capped rolling history kept off-screen so the chart can be rebuilt when the user + // returns to live mode after panning/zooming (see BandwidthGoLiveAction). + private readonly List _bandwidthReceivedHistory = []; + private readonly List _bandwidthSentHistory = []; + private void InitialBandwidthChart() { - var dayConfig = Mappers.Xy() - .X(dayModel => (double)dayModel.DateTime.Ticks / TimeSpan.FromHours(1).Ticks) - .Y(dayModel => dayModel.Value); + _bandwidthReceivedValues = []; + _bandwidthSentValues = []; + _bandwidthSessionStartTime = DateTime.Now; - Series = new SeriesCollection(dayConfig) - { - new LineSeries + UpdateMaxBandwidthValues(); + + var downloadColor = SKColor.Parse("#1ba1e2"); + var uploadColor = SKColor.Parse("#7fba00"); + + var labelColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray5") is System.Windows.Media.SolidColorBrush gray5 + ? new SKColor(gray5.Color.R, gray5.Color.G, gray5.Color.B, gray5.Color.A) + : new SKColor(0x68, 0x68, 0x68); + + var separatorColor = Application.Current?.TryFindResource("MahApps.Brushes.Gray8") is System.Windows.Media.SolidColorBrush gray8 + ? new SKColor(gray8.Color.R, gray8.Color.G, gray8.Color.B, gray8.Color.A) + : new SKColor(0x80, 0x80, 0x80); + + Series = + [ + new LineSeries { - Title = "Download", - Values = new ChartValues(), - PointGeometry = null + Name = Strings.Download, + Values = _bandwidthReceivedValues, + Mapping = (info, _) => double.IsNaN(info.Value) + ? Coordinate.Empty + : new((info.DateTime - _bandwidthSessionStartTime).TotalSeconds, info.Value), + GeometrySize = 0, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(downloadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(downloadColor.WithAlpha(0x33)) }, - new LineSeries + new LineSeries + { + Name = Strings.Upload, + Values = _bandwidthSentValues, + Mapping = (info, _) => double.IsNaN(info.Value) + ? Coordinate.Empty + : new((info.DateTime - _bandwidthSessionStartTime).TotalSeconds, info.Value), + GeometrySize = 0, + LineSmoothness = 0.3, + DataPadding = new LvcPoint(0, 0), + Stroke = new SolidColorPaint(uploadColor) { StrokeThickness = 1.5f }, + Fill = new SolidColorPaint(uploadColor.WithAlpha(0x33)) + } + ]; + + BandwidthXAxes = + [ + new Axis + { + Labeler = value => DateTimeHelper.DateTimeToTimeString( + _bandwidthSessionStartTime.AddSeconds(value)), + TextSize = 10, + Padding = new Padding(0, 4, 0, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) + { + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) + }, + MinStep = BandwidthChartWindowSeconds / 4.0, + ForceStepToMin = true + } + ]; + + BandwidthYAxes = + [ + new Axis { - Title = "Upload", - Values = new ChartValues(), - PointGeometry = null + MinLimit = 0, + Labeler = value => $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s", + TextSize = 11, + Padding = new Padding(4, 0), + LabelsPaint = new SolidColorPaint(labelColor), + SeparatorsPaint = new SolidColorPaint(separatorColor) + { + StrokeThickness = 1, + PathEffect = new DashEffect([10f, 10f]) + } + } + ]; + + BandwidthLegendTextPaint = new SolidColorPaint(labelColor) { SKTypeface = SKTypeface.Default }; + + BandwidthXAxes[0].PropertyChanged += (_, args) => + { + if (_updatingBandwidthAxisFromCode) + return; + + if (args.PropertyName is not (nameof(Axis.MinLimit) or nameof(Axis.MaxLimit))) + return; + + IsBandwidthLiveMode = false; + + var axis = BandwidthXAxes[0]; + if (axis.MinLimit.HasValue && axis.MaxLimit.HasValue) + { + _updatingBandwidthAxisFromCode = true; + axis.MinStep = (axis.MaxLimit.Value - axis.MinLimit.Value) / 4.0; + _updatingBandwidthAxisFromCode = false; } }; - FormatterDate = value => - DateTimeHelper.DateTimeToTimeString(new DateTime((long)(value * TimeSpan.FromHours(1).Ticks))); - FormatterSpeed = value => $"{FileSizeConverter.GetBytesReadable((long)value * 8)}it/s"; + UpdateBandwidthXAxisWindow(DateTime.Now); + } + + /// + /// Gets the series collection for the bandwidth chart (download/upload). + /// + public ISeries[] Series { get; private set; } + + /// + /// Gets the X-axes configuration for the bandwidth chart. + /// + public Axis[] BandwidthXAxes { get; private set; } + + /// + /// Gets the Y-axes configuration for the bandwidth chart. + /// + public Axis[] BandwidthYAxes { get; private set; } + + /// + /// Gets the themed paint used for the chart legend text. + /// + public SolidColorPaint BandwidthLegendTextPaint { get; private set; } + + /// + /// Gets a value indicating whether the bandwidth chart is in live (auto-scrolling) mode. + /// + public bool IsBandwidthLiveMode + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } } - public Func FormatterDate { get; set; } - public Func FormatterSpeed { get; set; } - public SeriesCollection Series { get; set; } + private void UpdateMaxBandwidthValues() + { + // The BandwidthMeter ticks once per second; keep a little off-screen headroom. + _maxBandwidthValues = (int)Math.Ceiling(BandwidthChartWindowSeconds * BandwidthValuesHeadroom); + } /// /// Loads the network interfaces. @@ -1523,21 +1670,83 @@ private void ResizeProfile(bool dueToChangedSize) private void ResetBandwidthChart() { - if (Series == null) + if (_bandwidthReceivedValues == null) return; - Series[0].Values.Clear(); - Series[1].Values.Clear(); + _bandwidthReceivedValues.Clear(); + _bandwidthSentValues.Clear(); + _bandwidthReceivedHistory.Clear(); + _bandwidthSentHistory.Clear(); - var currentDateTime = DateTime.Now; + _bandwidthSessionStartTime = DateTime.Now; + IsBandwidthLiveMode = true; - for (var i = 60; i > 0; i--) - { - var bandwidthInfo = new LvlChartsDefaultInfo(currentDateTime.AddSeconds(-i), double.NaN); + UpdateBandwidthXAxisWindow(DateTime.Now); + } - Series[0].Values.Add(bandwidthInfo); - Series[1].Values.Add(bandwidthInfo); - } + private void UpdateBandwidthXAxisWindow(DateTime now) + { + _updatingBandwidthAxisFromCode = true; + var axis = BandwidthXAxes[0]; + var elapsed = (now - _bandwidthSessionStartTime).TotalSeconds; + axis.MinStep = BandwidthChartWindowSeconds / 4.0; + axis.MinLimit = elapsed - BandwidthChartWindowSeconds; + axis.MaxLimit = elapsed; + _updatingBandwidthAxisFromCode = false; + } + + /// + /// Rescales the Y axis to the current values. The step is derived from a 20% padded + /// max and MaxLimit is set to step * 3, so the top label lands exactly on MaxLimit. + /// + private void UpdateBandwidthYAxis() + { + var maxVal = _bandwidthReceivedValues.Concat(_bandwidthSentValues) + .Where(p => !double.IsNaN(p.Value)) + .Select(p => p.Value) + .DefaultIfEmpty(0) + .Max(); + + if (!(maxVal > 0)) + return; + + var yAxis = BandwidthYAxes[0]; + var step = Math.Ceiling(maxVal * 1.2 / 3.0); + yAxis.MinStep = step; + yAxis.MaxLimit = step * 3; + } + + private void TrimBandwidthHistory(List history) + { + var excess = history.Count - _maxBandwidthValues; + if (excess > 0) + history.RemoveRange(0, excess); + } + + /// + /// Gets the command to return the bandwidth chart to live (auto-scrolling) mode. + /// + public ICommand BandwidthGoLiveCommand => new RelayCommand(_ => BandwidthGoLiveAction()); + + private void BandwidthGoLiveAction() + { + IsBandwidthLiveMode = true; + + // Samples received while inspecting were not added to the chart, so rebuild the + // rolling buffers from the most recent history to resume at the current time. + var recentReceived = _bandwidthReceivedHistory + .Skip(Math.Max(0, _bandwidthReceivedHistory.Count - _maxBandwidthValues)); + var recentSent = _bandwidthSentHistory + .Skip(Math.Max(0, _bandwidthSentHistory.Count - _maxBandwidthValues)); + + _bandwidthReceivedValues = new ObservableCollection(recentReceived); + _bandwidthSentValues = new ObservableCollection(recentSent); + + ((LineSeries)Series[0]).Values = _bandwidthReceivedValues; + ((LineSeries)Series[1]).Values = _bandwidthSentValues; + + UpdateBandwidthXAxisWindow(DateTime.Now); + UpdateBandwidthYAxis(); } private bool _resetBandwidthStatisticOnNextUpdate; @@ -1685,6 +1894,20 @@ private void SearchDispatcherTimer_Tick(object sender, EventArgs e) IsSearching = false; } + private void SettingsManager_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) + { + case nameof(SettingsInfo.NetworkInterface_BandwidthChartTime): + UpdateMaxBandwidthValues(); + + // Re-apply the visible window immediately so the change is reflected while running. + if (IsBandwidthLiveMode && _bandwidthMeter is { IsRunning: true }) + UpdateBandwidthXAxisWindow(DateTime.Now); + break; + } + } + private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e) { // Reset statistics @@ -1711,15 +1934,32 @@ private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e BandwidthDiffBytesSent = BandwidthTotalBytesSent - _bandwidthTotalBytesSentTemp; // Add chart entry - Series[0].Values.Add(new LvlChartsDefaultInfo(e.DateTime, e.ByteReceivedSpeed)); - Series[1].Values.Add(new LvlChartsDefaultInfo(e.DateTime, e.ByteSentSpeed)); + var receivedInfo = new LvlChartsDefaultInfo(e.DateTime, e.ByteReceivedSpeed); + var sentInfo = new LvlChartsDefaultInfo(e.DateTime, e.ByteSentSpeed); + + // Always record history (capped) so the chart can be rebuilt when returning to live mode. + _bandwidthReceivedHistory.Add(receivedInfo); + _bandwidthSentHistory.Add(sentInfo); + TrimBandwidthHistory(_bandwidthReceivedHistory); + TrimBandwidthHistory(_bandwidthSentHistory); + + // While the user inspects the chart (panned/zoomed, i.e. not live), keep the view + // frozen: skip updating the visible buffer and axes. New samples are still recorded + // above and become visible again via BandwidthGoLiveCommand. + if (!IsBandwidthLiveMode) + return; + + _bandwidthReceivedValues.Add(receivedInfo); + _bandwidthSentValues.Add(sentInfo); + + if (_bandwidthReceivedValues.Count > _maxBandwidthValues) + _bandwidthReceivedValues.RemoveAt(0); - // Remove data older than 60 seconds - if (Series[0].Values.Count > 59) - Series[0].Values.RemoveAt(0); + if (_bandwidthSentValues.Count > _maxBandwidthValues) + _bandwidthSentValues.RemoveAt(0); - if (Series[1].Values.Count > 59) - Series[1].Values.RemoveAt(0); + UpdateBandwidthXAxisWindow(e.DateTime); + UpdateBandwidthYAxis(); } private void NetworkInterface_UserHasCanceled(object sender, EventArgs e) diff --git a/Source/NETworkManager/ViewModels/SettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsViewModel.cs index 36b73fd514..be82a8a755 100644 --- a/Source/NETworkManager/ViewModels/SettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsViewModel.cs @@ -120,6 +120,7 @@ public SettingsViewInfo SelectedSettingsView private SettingsSettingsView _settingsSettingsView; private SettingsProfilesView _settingsProfilesView; private DashboardSettingsView _dashboardSettingsView; + private NetworkInterfaceSettingsView _networkInterfaceSettingsView; private IPScannerSettingsView _ipScannerSettingsView; private PortScannerSettingsView _portScannerSettingsView; private PingMonitorSettingsView _pingMonitorSettingsView; @@ -265,6 +266,11 @@ private void ChangeSettingsContent(SettingsViewInfo settingsViewInfo) SettingsContent = _dashboardSettingsView; break; + case SettingsName.NetworkInterface: + _networkInterfaceSettingsView ??= new NetworkInterfaceSettingsView(); + + SettingsContent = _networkInterfaceSettingsView; + break; case SettingsName.IPScanner: _ipScannerSettingsView ??= new IPScannerSettingsView(); diff --git a/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml new file mode 100644 index 0000000000..64e1a969ee --- /dev/null +++ b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs new file mode 100644 index 0000000000..c0ce345c91 --- /dev/null +++ b/Source/NETworkManager/Views/NetworkInterfaceSettingsView.xaml.cs @@ -0,0 +1,14 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +public partial class NetworkInterfaceSettingsView +{ + private readonly NetworkInterfaceSettingsViewModel _viewModel = new(); + + public NetworkInterfaceSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; + } +} diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml index ffbddcdcc1..ec1f16d1e2 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml @@ -14,7 +14,7 @@ xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" xmlns:internalControls="clr-namespace:NETworkManager.Controls" - xmlns:liveChart="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" + xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF" xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" xmlns:networkManager="clr-namespace:NETworkManager" @@ -31,7 +31,6 @@ - @@ -841,28 +840,62 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + @@ -897,19 +930,23 @@ + Text="{Binding BandwidthBytesReceivedSpeed, Converter={StaticResource BandwidthBytesToSpeedConverter}}" + ToolTip="{Binding BandwidthBytesReceivedSpeed, Converter={StaticResource BandwidthBytesToSpeedConverter}, ConverterParameter=bytes}" /> + Text="{Binding BandwidthBytesSentSpeed, Converter={StaticResource BandwidthBytesToSpeedConverter}}" + ToolTip="{Binding BandwidthBytesSentSpeed, Converter={StaticResource BandwidthBytesToSpeedConverter}, ConverterParameter=bytes}" /> + Text="{Binding BandwidthTotalBytesReceived, Converter={StaticResource Bytes1000ToSizeConverter}}" + ToolTip="{Binding BandwidthTotalBytesReceived, StringFormat={}{0:N0} Bytes}" /> + Text="{Binding BandwidthTotalBytesSent, Converter={StaticResource Bytes1000ToSizeConverter}}" + ToolTip="{Binding BandwidthTotalBytesSent, StringFormat={}{0:N0} Bytes}" /> @@ -920,11 +957,13 @@ + Text="{Binding BandwidthDiffBytesReceived, Converter={StaticResource Bytes1000ToSizeConverter}}" + ToolTip="{Binding BandwidthDiffBytesReceived, StringFormat={}{0:N0} Bytes}" /> + Text="{Binding BandwidthDiffBytesSent, Converter={StaticResource Bytes1000ToSizeConverter}}" + ToolTip="{Binding BandwidthDiffBytesSent, StringFormat={}{0:N0} Bytes}" /> From 85433ce6a1f355f51c2e7b79a822b57ed4c3d629 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:02:41 +0200 Subject: [PATCH 2/8] Fix: Bugs based on claude review --- .../BytesToExactStringConverter.cs | 23 +++++++ .../Network/BandwidthMeter.cs | 63 ++++++++++++++----- .../ViewModels/NetworkInterfaceViewModel.cs | 13 ++-- .../Views/NetworkInterfaceView.xaml | 9 +-- Website/docs/application/network-interface.md | 28 ++++++++- 5 files changed, 112 insertions(+), 24 deletions(-) create mode 100644 Source/NETworkManager.Converters/BytesToExactStringConverter.cs diff --git a/Source/NETworkManager.Converters/BytesToExactStringConverter.cs b/Source/NETworkManager.Converters/BytesToExactStringConverter.cs new file mode 100644 index 0000000000..062dad8cb0 --- /dev/null +++ b/Source/NETworkManager.Converters/BytesToExactStringConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Converters; + +/// +/// Converts a byte count to its exact value with thousands separators and a "Bytes" unit +/// (e.g. "6,783,176,192 Bytes"). Intended for tooltips that complement a human-readable size. +/// +public sealed class BytesToExactStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value != null ? string.Format(culture, "{0:N0} {1}", (long)value, Strings.Bytes) : "-/-"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/Source/NETworkManager.Models/Network/BandwidthMeter.cs b/Source/NETworkManager.Models/Network/BandwidthMeter.cs index 22b4afd548..33018b3634 100644 --- a/Source/NETworkManager.Models/Network/BandwidthMeter.cs +++ b/Source/NETworkManager.Models/Network/BandwidthMeter.cs @@ -1,5 +1,7 @@ -using System; +using System; +using System.Diagnostics; using System.Linq; +using System.Net.NetworkInformation; using System.Windows.Threading; namespace NETworkManager.Models.Network; @@ -30,6 +32,12 @@ private void Timer_Tick(object sender, EventArgs e) #region Variables + /// + /// The default sample interval in milliseconds. Kept as a constant because the speed + /// calculation and the consuming view model derive timing from it. + /// + public const double DefaultUpdateInterval = 1000; + public double UpdateInterval { get; @@ -42,12 +50,13 @@ public double UpdateInterval field = value; } - } = 1000; + } = DefaultUpdateInterval; public bool IsRunning => _timer.IsEnabled; private readonly DispatcherTimer _timer = new(); private readonly System.Net.NetworkInformation.NetworkInterface _networkInterface; + private readonly Stopwatch _stopwatch = new(); private long _previousBytesSent; private long _previousBytesReceived; private bool _canUpdate; // Collect initial data for correct calculation @@ -76,34 +85,60 @@ public void Stop() { _timer.Stop(); - // Reset + // Reset, so the next sample re-seeds the baseline (avoids a speed spike after a pause). _canUpdate = false; } private void Update() { - var stats = _networkInterface.GetIPv4Statistics(); + // The interface may have been removed/disabled after this meter was created. + if (_networkInterface == null) + return; - var totalBytesSent = stats.BytesSent; - var totalBytesReceived = stats.BytesReceived; + IPInterfaceStatistics stats; - var byteSentSpeed = totalBytesSent - _previousBytesSent; - var byteReceivedSpeed = totalBytesReceived - _previousBytesReceived; + try + { + // IPStatistics covers both IPv4 and IPv6 traffic on the interface. + stats = _networkInterface.GetIPStatistics(); + } + catch (NetworkInformationException) + { + // Transient failure (e.g. adapter going down) - skip this tick. + return; + } - _previousBytesSent = stats.BytesSent; - _previousBytesReceived = stats.BytesReceived; + var totalBytesSent = stats.BytesSent; + var totalBytesReceived = stats.BytesReceived; - // Need to collect initial data for correct calculation... + // First sample after start/resume: seed the baseline and start timing, no speed yet. if (!_canUpdate) { + _previousBytesSent = totalBytesSent; + _previousBytesReceived = totalBytesReceived; + _stopwatch.Restart(); _canUpdate = true; return; } - OnUpdateSpeed(new BandwidthMeterSpeedArgs(DateTime.Now, totalBytesReceived, totalBytesSent, byteReceivedSpeed, - byteSentSpeed)); + var elapsedSeconds = _stopwatch.Elapsed.TotalSeconds; + _stopwatch.Restart(); + + // Clamp negative deltas: cumulative counters can reset/wrap (driver reset, disable/enable). + var deltaSent = Math.Max(0, totalBytesSent - _previousBytesSent); + var deltaReceived = Math.Max(0, totalBytesReceived - _previousBytesReceived); + + // Derive a true per-second rate from the measured elapsed time (robust against timer jitter). + var byteSentSpeed = elapsedSeconds > 0 ? (long)(deltaSent / elapsedSeconds) : 0; + var byteReceivedSpeed = elapsedSeconds > 0 ? (long)(deltaReceived / elapsedSeconds) : 0; + + _previousBytesSent = totalBytesSent; + _previousBytesReceived = totalBytesReceived; + + OnUpdateSpeed(new BandwidthMeterSpeedArgs(DateTime.Now, totalBytesReceived, totalBytesSent, + byteReceivedSpeed, byteSentSpeed)); } #endregion -} \ No newline at end of file +} diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index 97d478737f..7ad64fb27f 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -693,7 +693,6 @@ public GridLength ProfileWidth /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. public NetworkInterfaceViewModel() { _isLoading = true; @@ -898,8 +897,10 @@ private set private void UpdateMaxBandwidthValues() { - // The BandwidthMeter ticks once per second; keep a little off-screen headroom. - _maxBandwidthValues = (int)Math.Ceiling(BandwidthChartWindowSeconds * BandwidthValuesHeadroom); + // Number of samples that fit in the visible window (derived from the meter's sample + // interval), plus a little off-screen headroom. + var samplesPerWindow = BandwidthChartWindowSeconds * 1000 / BandwidthMeter.DefaultUpdateInterval; + _maxBandwidthValues = (int)Math.Ceiling(samplesPerWindow * BandwidthValuesHeadroom); } /// @@ -1769,6 +1770,8 @@ private void ResumeBandwidthMeter() if (_bandwidthMeter is not { IsRunning: false }) return; + // The meter is only paused while this view is hidden (i.e. another application is shown). + // Returning to it starts a fresh measurement: reset the chart and statistics, then start. ResetBandwidthChart(); _resetBandwidthStatisticOnNextUpdate = true; @@ -1923,13 +1926,13 @@ private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e // Measured time BandwidthMeasuredTime = DateTime.Now - BandwidthStartTime; - // Current download/upload + // Interface totals (cumulative, since boot) + current speed BandwidthTotalBytesReceived = e.TotalBytesReceived; BandwidthTotalBytesSent = e.TotalBytesSent; BandwidthBytesReceivedSpeed = e.ByteReceivedSpeed; BandwidthBytesSentSpeed = e.ByteSentSpeed; - // Total download/upload + // Amount transferred since the measurement started (this session) BandwidthDiffBytesReceived = BandwidthTotalBytesReceived - _bandwidthTotalBytesReceivedTemp; BandwidthDiffBytesSent = BandwidthTotalBytesSent - _bandwidthTotalBytesSentTemp; diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml index ec1f16d1e2..a64a5afb04 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml @@ -30,6 +30,7 @@ + + ToolTip="{Binding BandwidthTotalBytesReceived, Converter={StaticResource BytesToExactStringConverter}}" /> + ToolTip="{Binding BandwidthTotalBytesSent, Converter={StaticResource BytesToExactStringConverter}}" /> @@ -958,12 +959,12 @@ Text="{x:Static localization:Strings.CurrentlyDownloaded}" /> + ToolTip="{Binding BandwidthDiffBytesReceived, Converter={StaticResource BytesToExactStringConverter}}" /> + ToolTip="{Binding BandwidthDiffBytesSent, Converter={StaticResource BytesToExactStringConverter}}" /> diff --git a/Website/docs/application/network-interface.md b/Website/docs/application/network-interface.md index 4c8314032e..9385ff6719 100644 --- a/Website/docs/application/network-interface.md +++ b/Website/docs/application/network-interface.md @@ -50,10 +50,26 @@ The following buttons are available at the bottom left: On the **Bandwidth** tab, you can monitor the currently used bandwidth of the selected network adapter. -The current download and upload speed is displayed in bit/s (B/s) and automatically scales to KBit/s (KB/s), MBit/s (MB/s), or GBit/s (GB/s) depending on the bandwidth in use. The view also shows when the measurement started and the total amount downloaded and uploaded since then. +The chart plots the download and upload speed over time. By default it displays the last 60 seconds (see [Chart time (seconds)](#chart-time-seconds)) and scrolls automatically as new data arrives (**live mode**). + +Speeds are shown in bit/s and automatically scale to KBit/s, MBit/s, or GBit/s depending on the bandwidth in use. Hover over a value to see the equivalent in byte/s. + +Below the chart, additional statistics are displayed: the current download and upload speed, the total amount received and sent by the adapter, when the measurement started and how long it has been running, and the amount downloaded and uploaded since the measurement started. Hover over a byte value to see the exact number of bytes. ![Network Interface - Bandwidth](../img/network-interface--bandwidth.png) +### Chart + +You can interact with the chart to inspect past data: + +| Action | Description | +|--------|-------------| +| **Mouse wheel** | Zoom in and out on the time axis | +| **Left mouse button + drag** | Pan the chart left and right | +| **Right mouse button + drag** | Zoom into the selected section | + +When you zoom or pan, the chart leaves live mode and stops scrolling. A **Live** button then appears in the top-right corner of the chart — click it to return to live mode and resume auto-scrolling. + :::note If you switch to another tool, monitoring stops and the statistics are reset when you switch back. @@ -222,3 +238,13 @@ Secondary DNS server for the selected network adapter. **Default:** `Empty` **Example:** `1.0.0.1` + +## Settings + +### Chart time (seconds) + +Time range in seconds displayed in the bandwidth chart. + +**Type:** `Integer` [Min `30`, Max `3600`] + +**Default:** `60` From bfb913d562614ba7d0669218e2ce85b1c471ba64 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:11:39 +0200 Subject: [PATCH 3/8] Docs: #3457 --- Website/docs/changelog/next-release.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index 5c5cbec27f..bc012d8056 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -74,6 +74,9 @@ Release date: **xx.xx.2025** **Network Interface** - Added Network Profile (domain, private, public) information to the Network Interface details view, if available. [#3383](https://github.com/BornToBeRoot/NETworkManager/pull/3383) +- Migrated the bandwidth chart from LiveCharts to LiveCharts2. Added a tooltip showing the download/upload speed on hover. [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) +- The bandwidth chart is now interactive: zoom with the mouse wheel, pan by dragging with the left mouse button, and zoom into a section by dragging with the right mouse button. While inspecting, the chart pauses auto-scrolling and a **Live** button returns it to live mode. The visible time window is now configurable via the new **Chart time** setting (default 60 seconds). [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) +- Reworked the network usage statistics: byte counts are now shown in a human-readable format (exact bytes on hover) and the speed is shown in bit/s (byte/s on hover). [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) **Ping Monitor** @@ -95,6 +98,8 @@ Release date: **xx.xx.2025** **General** - Fixed the last column of various DataGrids not resizing to fill the available view width. [#3417](https://github.com/BornToBeRoot/NETworkManager/pull/3417) +- Fixed `CancellationTokenSource` leak in `IPScanner`, `PortScanner`, `Traceroute`, `PingMonitor`, `PingMonitorHost` and `SNMP` ViewModels. The previous instance was never disposed before being overwritten on each run, leaking the underlying `WaitHandle`. [#3448](https://github.com/BornToBeRoot/NETworkManager/pull/3448) +- Fixed a `Dispatcher.ShutdownStarted` handler leak in the Dragablz tab items (PowerShell, PuTTY, TigerVNC, Remote Desktop and Web Console controls, plus the IP Scanner, Port Scanner, Traceroute, DNS Lookup, IP Geolocation, SNMP, SNTP Lookup and Whois views). The handler was subscribed in the constructor but never removed, keeping each closed tab (view and view model) alive until the application exited. It is now unsubscribed in `CloseTab()`; the Web Console additionally disposes its WebView2 instance. [#3454](https://github.com/BornToBeRoot/NETworkManager/pull/3454) **Port Scanner** @@ -111,6 +116,7 @@ Release date: **xx.xx.2025** **Network Interface** - Fixed `Renew6Action` incorrectly calling `ipconfig /renew` (IPv4) instead of `ipconfig /renew6` (IPv6) when renewing the IPv6 address. [#3441](https://github.com/BornToBeRoot/NETworkManager/pull/3441) +- Bandwidth measurement now includes IPv6 traffic (previously IPv4 only), derives a time-accurate speed, and no longer crashes or shows spikes on adapter errors or interface counter resets. [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) **TigerVNC** @@ -118,9 +124,7 @@ Release date: **xx.xx.2025** ## Dependencies, Refactoring & Documentation -- Migrated from `LiveCharts` to `LiveCharts2` (`LiveChartsCore.SkiaSharpView.WPF`) for chart rendering. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449) -- Fixed `CancellationTokenSource` leak in `IPScanner`, `PortScanner`, `Traceroute`, `PingMonitor`, `PingMonitorHost` and `SNMP` ViewModels. The previous instance was never disposed before being overwritten on each run, leaking the underlying `WaitHandle`. [#3448](https://github.com/BornToBeRoot/NETworkManager/pull/3448) -- Fixed a `Dispatcher.ShutdownStarted` handler leak in the Dragablz tab items (PowerShell, PuTTY, TigerVNC, Remote Desktop and Web Console controls, plus the IP Scanner, Port Scanner, Traceroute, DNS Lookup, IP Geolocation, SNMP, SNTP Lookup and Whois views). The handler was subscribed in the constructor but never removed, keeping each closed tab (view and view model) alive until the application exited. It is now unsubscribed in `CloseTab()`; the Web Console additionally disposes its WebView2 instance. [#3454](https://github.com/BornToBeRoot/NETworkManager/pull/3454) +- Migrated from `LiveCharts` to `LiveCharts2` (`LiveChartsCore.SkiaSharpView.WPF`) for chart rendering. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449) [#3457](https://github.com/BornToBeRoot/NETworkManager/pull/3457) - Replace fire-and-forget `.ConfigureAwait(false)` calls with explicit discard assignments (`_ = SomeAsyncOperation()`) across command handlers, startup/load paths and profile callbacks. [#3441](https://github.com/BornToBeRoot/NETworkManager/pull/3441) - Code cleanup & refactoring - Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) From a08c549a6fe3d00743ded552b1c59f3ee6e2adb0 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:18:25 +0200 Subject: [PATCH 4/8] Fix: Copilot feedback --- .../ViewModels/NetworkInterfaceViewModel.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index 7ad64fb27f..c7f607aed0 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -697,10 +697,13 @@ public NetworkInterfaceViewModel() { _isLoading = true; - _ = LoadNetworkInterfaces(); - + // Initialize the bandwidth chart before loading interfaces, so the chart collections + // exist by the time the (possibly synchronous) interface load selects an interface and + // starts the bandwidth meter. InitialBandwidthChart(); + _ = LoadNetworkInterfaces(); + // Profiles CreateTags(); @@ -756,6 +759,10 @@ private void InitialBandwidthChart() _bandwidthSentValues = []; _bandwidthSessionStartTime = DateTime.Now; + // Start in live mode so samples are plotted immediately, independent of when the meter + // starts relative to this initialization. + IsBandwidthLiveMode = true; + UpdateMaxBandwidthValues(); var downloadColor = SKColor.Parse("#1ba1e2"); From 397dbb9d8c9cd760b47874ebc6e382330176636a Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:24:26 +0200 Subject: [PATCH 5/8] Update network-interface--bandwidth.png --- .../docs/img/network-interface--bandwidth.png | Bin 50640 -> 85880 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Website/docs/img/network-interface--bandwidth.png b/Website/docs/img/network-interface--bandwidth.png index df4ad0532ec67fc7bed8c9694f9eb0d219cf314c..e18b3a1f9e33b632420516b6c61fdf5e19f7314d 100644 GIT binary patch literal 85880 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

# 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 Date: Sat, 30 May 2026 16:27:38 +0200 Subject: [PATCH 6/8] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../ViewModels/NetworkInterfaceSettingsViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs index d3ad329b21..450a2c5a5c 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceSettingsViewModel.cs @@ -32,7 +32,7 @@ public int BandwidthChartTime #endregion - #region Contructor, load settings + #region Constructor, load settings ///

/// Initializes a new instance of the class. From 6ddf0cea276b0f66d9ca4314df200244ed7dfa1e Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:41:55 +0200 Subject: [PATCH 7/8] Update NetworkInterfaceViewModel.cs --- .../ViewModels/NetworkInterfaceViewModel.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index c7f607aed0..ec851aa94d 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -1939,6 +1939,15 @@ private void BandwidthMeter_UpdateSpeed(object sender, BandwidthMeterSpeedArgs e BandwidthBytesReceivedSpeed = e.ByteReceivedSpeed; BandwidthBytesSentSpeed = e.ByteSentSpeed; + // A counter reset (e.g. adapter disable/enable, driver reset, sleep/resume) can drop the + // cumulative totals below the session baseline. Re-baseline in that case so the session + // amounts below never go negative; they then resume counting from the reset point. + if (BandwidthTotalBytesReceived < _bandwidthTotalBytesReceivedTemp) + _bandwidthTotalBytesReceivedTemp = BandwidthTotalBytesReceived; + + if (BandwidthTotalBytesSent < _bandwidthTotalBytesSentTemp) + _bandwidthTotalBytesSentTemp = BandwidthTotalBytesSent; + // Amount transferred since the measurement started (this session) BandwidthDiffBytesReceived = BandwidthTotalBytesReceived - _bandwidthTotalBytesReceivedTemp; BandwidthDiffBytesSent = BandwidthTotalBytesSent - _bandwidthTotalBytesSentTemp; From 8b9f323f84fd019a1a49236bbcdcdcdee4cbddd4 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sat, 30 May 2026 16:50:07 +0200 Subject: [PATCH 8/8] Update NetworkInterfaceView.xaml --- Source/NETworkManager/Views/NetworkInterfaceView.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml index a64a5afb04..a8054f4002 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml @@ -1580,7 +1580,7 @@ - @@ -1588,7 +1588,7 @@ IsChecked="{Binding Path=ProfileFilterTagsMatchAll}" Margin="10,0,0,0" /> -