From f4cfc9df7f263c49d4c1235624d9d8a94c963162 Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Sat, 30 May 2026 00:25:46 +0200
Subject: [PATCH 1/6] Feature: Ping Monitor - Zoom & drag chart
---
.../Resources/Strings.Designer.cs | 22 ++-
.../Resources/Strings.resx | 6 +
.../GlobalStaticConfiguration.cs | 1 +
.../NETworkManager.Settings/SettingsInfo.cs | 13 ++
.../Resources/Styles/ExpanderStyles.xaml | 68 +++++++
.../ViewModels/PingMonitorHostViewModel.cs | 26 ---
.../PingMonitorSettingsViewModel.cs | 20 +++
.../ViewModels/PingMonitorViewModel.cs | 168 +++++++++++++++---
.../Views/PingMonitorHostView.xaml | 55 +-----
.../Views/PingMonitorSettingsView.xaml | 3 +
.../NETworkManager/Views/PingMonitorView.xaml | 62 ++++++-
.../Views/PingMonitorView.xaml.cs | 13 +-
Website/docs/application/ping-monitor.md | 29 ++-
13 files changed, 377 insertions(+), 109 deletions(-)
diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
index 0ff7f753ea..08463b220d 100644
--- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
+++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs
@@ -1552,7 +1552,16 @@ public static string CapsLockIsEnabled {
return ResourceManager.GetString("CapsLockIsEnabled", resourceCulture);
}
}
-
+
+ ///
+ /// Looks up a localized string similar to Chart time (seconds).
+ ///
+ public static string ChartTimeInSeconds {
+ get {
+ return ResourceManager.GetString("ChartTimeInSeconds", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Capture.
///
@@ -6237,7 +6246,16 @@ public static string Lime {
return ResourceManager.GetString("Lime", resourceCulture);
}
}
-
+
+ ///
+ /// Looks up a localized string similar to Live.
+ ///
+ public static string Live {
+ get {
+ return ResourceManager.GetString("Live", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Listeners.
///
diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx
index 4cb9414464..886495042e 100644
--- a/Source/NETworkManager.Localization/Resources/Strings.resx
+++ b/Source/NETworkManager.Localization/Resources/Strings.resx
@@ -735,6 +735,9 @@
Caps lock is enabled!
+
+ Chart time (seconds)
+
Check for updates at startup
@@ -1513,6 +1516,9 @@ Profile files are not affected!
Lime
+
+ Live
+
Magenta
diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs
index ef48d365e8..30df1a5117 100644
--- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs
+++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs
@@ -143,6 +143,7 @@ public static class GlobalStaticConfiguration
public static int PingMonitor_TTL => 64;
public static int PingMonitor_WaitTime => 1000;
public static bool PingMonitor_ExpandHostView => false;
+ public static int PingMonitor_ChartTime => 120;
public static ExportFileType PingMonitor_ExportFileType => ExportFileType.Csv;
// Application: Traceroute
diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs
index 1040e8dd83..09a73eccb0 100644
--- a/Source/NETworkManager.Settings/SettingsInfo.cs
+++ b/Source/NETworkManager.Settings/SettingsInfo.cs
@@ -1508,6 +1508,19 @@ public bool PingMonitor_ExpandHostView
}
} = GlobalStaticConfiguration.PingMonitor_ExpandHostView;
+ public int PingMonitor_ChartTime
+ {
+ get;
+ set
+ {
+ if (value == field)
+ return;
+
+ field = value;
+ OnPropertyChanged();
+ }
+ } = GlobalStaticConfiguration.PingMonitor_ChartTime;
+
public string PingMonitor_ExportFilePath
{
get;
diff --git a/Source/NETworkManager/Resources/Styles/ExpanderStyles.xaml b/Source/NETworkManager/Resources/Styles/ExpanderStyles.xaml
index 491389b5a4..5d9a6e02ae 100644
--- a/Source/NETworkManager/Resources/Styles/ExpanderStyles.xaml
+++ b/Source/NETworkManager/Resources/Styles/ExpanderStyles.xaml
@@ -75,6 +75,74 @@
Value="{DynamicResource ResourceKey=ExpanderDownHeader}" />
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/Source/NETworkManager/Views/PingMonitorView.xaml b/Source/NETworkManager/Views/PingMonitorView.xaml
index c2e6e2686d..ee55359028 100644
--- a/Source/NETworkManager/Views/PingMonitorView.xaml
+++ b/Source/NETworkManager/Views/PingMonitorView.xaml
@@ -14,10 +14,26 @@
-
+ BorderBrush="{DynamicResource MahApps.Brushes.Gray8}"
+ Margin="0,0,0,10">
+
+
+
+
+
@@ -228,11 +244,53 @@
YAxes="{Binding PingYAxes}"
DrawMarginFrame="{x:Null}"
EasingFunction="{x:Null}"
+ ZoomMode="PanX, ZoomX, NoFit"
+ ContextMenuOpening="Chart_ContextMenuOpening"
RenderOptions.BitmapScalingMode="NearestNeighbor">
+
diff --git a/Source/NETworkManager/Views/PingMonitorView.xaml.cs b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
index 97e6720162..32f3f7c2ac 100644
--- a/Source/NETworkManager/Views/PingMonitorView.xaml.cs
+++ b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
@@ -1,5 +1,6 @@
using System;
using System.Net;
+using System.Windows.Controls;
using NETworkManager.ViewModels;
namespace NETworkManager.Views;
@@ -34,13 +35,17 @@ public void Stop()
_viewModel.Stop();
}
- public void Export()
+ private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
- _ = _viewModel.Export();
+ Stop();
}
- private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
+ ///
+ /// Suppresses the host context menu while the pointer is over the chart, so a
+ /// right-click drag can be used to zoom into a section instead of opening the menu.
+ ///
+ private void Chart_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
- Stop();
+ e.Handled = true;
}
}
\ No newline at end of file
diff --git a/Website/docs/application/ping-monitor.md b/Website/docs/application/ping-monitor.md
index b79eacfacc..d76aff93a4 100644
--- a/Website/docs/application/ping-monitor.md
+++ b/Website/docs/application/ping-monitor.md
@@ -37,12 +37,29 @@ Example: `10.0.0.0/24; 10.0.[10-20]1`
:::
+### Chart
+
+Each monitored host shows a latency chart over time. By default the chart displays the last 2 minutes (see [Chart time (seconds)](#chart-time-seconds)) and scrolls automatically as new results arrive (**live mode**).
+
+You can interact with the chart to inspect past results:
+
+| 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.
+
### Context menu
+Right-click a monitored host (anywhere except the chart) to open the context menu:
+
| Action | Description |
|--------|-------------|
-| **Copy** | Copies the selected information to the clipboard |
-| **Export...** | Exports the selected or all results to a file |
+| **Export...** | Exports the results of the host to a file |
+
+Right-clicking an individual field (hostname, IP address, ...) instead lets you **Copy** its value to the clipboard.
## Profile
@@ -115,6 +132,14 @@ Time in milliseconds to wait between each ping.
**Default:** `1000`
+### Chart time (seconds)
+
+Time range in seconds displayed in the latency chart.
+
+**Type:** `Integer` [Min `30`, Max `3600`]
+
+**Default:** `120`
+
### Expand host view
Expand the host view to show more information when the host is added.
From ede1cceca899067e640091ec6f1f14d53093975d Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Sat, 30 May 2026 00:36:04 +0200
Subject: [PATCH 2/6] Docs: #3453
---
Website/docs/changelog/next-release.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md
index d384d45df3..4a641cf053 100644
--- a/Website/docs/changelog/next-release.md
+++ b/Website/docs/changelog/next-release.md
@@ -78,6 +78,8 @@ Release date: **xx.xx.2025**
**Ping Monitor**
- Migrated charts from LiveCharts to LiveCharts2. Added a tooltip showing the ping time on hover. [#3449](https://github.com/BornToBeRoot/NETworkManager/pull/3449)
+- The latency 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 2 minutes). [#3453](https://github.com/BornToBeRoot/NETworkManager/pull/3453)
+- Export is now triggered by right-clicking a host directly (instead of the list context menu), so right-clicking the chart can be used to zoom into a section. [#3453](https://github.com/BornToBeRoot/NETworkManager/pull/3453)
**Discovery Protocol**
From 46bb39227ec473dae4146376e9a7597df2d7a1fa Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Sat, 30 May 2026 01:08:32 +0200
Subject: [PATCH 3/6] Feature: Bug fixes + adjust export icon
---
.../Resources/ContextMenu/ContextMenu.xaml | 2 +-
.../ViewModels/PingMonitorHostViewModel.cs | 2 +
.../ViewModels/PingMonitorViewModel.cs | 67 ++++++++++++-------
.../Views/BitCalculatorView.xaml | 2 +-
.../NETworkManager/Views/ConnectionsView.xaml | 4 +-
.../NETworkManager/Views/DNSLookupView.xaml | 4 +-
.../Views/DiscoveryProtocolView.xaml | 2 +-
Source/NETworkManager/Views/FirewallView.xaml | 4 +-
.../Views/HostsFileEditorView.xaml | 4 +-
.../Views/IPGeolocationView.xaml | 2 +-
.../NETworkManager/Views/IPScannerView.xaml | 4 +-
.../NETworkManager/Views/ListenersView.xaml | 4 +-
.../Views/LookupOUILookupView.xaml | 4 +-
.../Views/LookupPortLookupView.xaml | 4 +-
.../Views/NeighborTableView.xaml | 4 +-
.../Views/NetworkInterfaceView.xaml | 2 +-
.../NETworkManager/Views/PingMonitorView.xaml | 2 +-
.../Views/PingMonitorView.xaml.cs | 8 +++
.../NETworkManager/Views/PortScannerView.xaml | 4 +-
Source/NETworkManager/Views/SNMPView.xaml | 4 +-
.../NETworkManager/Views/SNTPLookupView.xaml | 4 +-
.../Views/SubnetCalculatorSubnettingView.xaml | 4 +-
.../NETworkManager/Views/TracerouteView.xaml | 4 +-
Source/NETworkManager/Views/WiFiView.xaml | 4 +-
24 files changed, 90 insertions(+), 59 deletions(-)
diff --git a/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml b/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml
index 97a0728e5a..096157919f 100644
--- a/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml
+++ b/Source/NETworkManager/Resources/ContextMenu/ContextMenu.xaml
@@ -88,7 +88,7 @@
-
+
diff --git a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs
index cb63698959..1812017762 100644
--- a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs
+++ b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs
@@ -672,6 +672,7 @@ private void RemoveGroup(string group)
continue;
Hosts[i].Stop();
+ Hosts[i].Cleanup();
Hosts.RemoveAt(i);
}
}
@@ -688,6 +689,7 @@ private void RemoveHostByGuid(Guid hostId)
return;
Hosts[i].Stop();
+ Hosts[i].Cleanup();
Hosts.RemoveAt(i);
}
diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
index e1c1cc35e6..2558a171ea 100644
--- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
+++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs
@@ -74,7 +74,7 @@ public PingMonitorViewModel(Guid hostId, Action removeHostByGuid,
public readonly Guid HostId;
private readonly Action _removeHostByGuid;
- private List _pingInfoList;
+ private List _pingInfoList = [];
///
/// Gets the title of the monitor, typically "Hostname # IP".
@@ -279,11 +279,11 @@ private void InitialTimeChart()
var chartColor = SKColor.Parse("#1ba1e2");
- var labelColor = Application.Current.TryFindResource("MahApps.Brushes.Gray5") is System.Windows.Media.SolidColorBrush gray5
+ 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
+ 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);
@@ -490,12 +490,18 @@ private void GoLiveAction()
{
IsLiveMode = true;
- // Drop everything that was buffered while inspecting and no longer fits into the
- // live rolling window, so the chart returns to its normal sliding behavior.
- while (_pingValues.Count > _maxPingValues)
- _pingValues.RemoveAt(0);
+ // Samples received while inspecting were not added to the chart, so rebuild the
+ // rolling buffer from the most recent history to resume at the current time.
+ var recent = _pingInfoList
+ .Skip(Math.Max(0, _pingInfoList.Count - _maxPingValues))
+ .Select(info => new LvlChartsDefaultInfo(
+ info.Timestamp, info.Status == IPStatus.Success ? info.Time : double.NaN));
+
+ _pingValues = new ObservableCollection(recent);
+ ((LineSeries)Series[0]).Values = _pingValues;
UpdateXAxisWindow(DateTime.Now);
+ UpdateYAxis();
}
#endregion
@@ -682,30 +688,19 @@ private void Ping_PingReceived(object sender, PingReceivedArgs e)
if (_sessionId != capturedSession)
return;
- _pingValues.Add(timeInfo);
-
// While the user is inspecting the chart (zoomed/panned, i.e. not live), keep
- // the view frozen: don't trim the rolling buffer, don't move the X window and
- // don't rescale the Y axis. New samples keep getting buffered and become
- // visible again once the user returns to live mode.
+ // the chart frozen: ignore new samples here so the view does not move and the
+ // buffer does not grow. The sample is still recorded in the history below and
+ // becomes visible again when the user returns to live mode (see GoLiveAction).
if (!IsLiveMode)
return;
+ _pingValues.Add(timeInfo);
if (_pingValues.Count > _maxPingValues)
_pingValues.RemoveAt(0);
UpdateXAxisWindow(timeInfo.DateTime);
-
- // Compute step from a 20% padded max, then set MaxLimit = step * 3 so the
- // 4th label lands exactly on MaxLimit and is never cut off by rounding.
- var maxVal = _pingValues.Where(p => !double.IsNaN(p.Value)).Select(p => p.Value).DefaultIfEmpty(0).Max();
- if (!(maxVal > 0))
- return;
-
- var yAxis = PingYAxes[0];
- var step = Math.Ceiling(maxVal * 1.2 / 3.0);
- yAxis.MinStep = step;
- yAxis.MaxLimit = step * 3;
+ UpdateYAxis();
});
// Add to history
@@ -749,6 +744,15 @@ private void Ping_PingException(object sender, PingExceptionArgs e)
IsErrorMessageDisplayed = true;
}
+ ///
+ /// Unsubscribes from global settings changes. Must be called when the host is removed,
+ /// so this transient view model is not kept alive by the long-lived settings singleton.
+ ///
+ public void Cleanup()
+ {
+ SettingsManager.Current.PropertyChanged -= SettingsManager_PropertyChanged;
+ }
+
private void SettingsManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
@@ -778,5 +782,22 @@ private void UpdateMaxPingValues()
_maxPingValues = (int)Math.Ceiling(visibleValues * PingValuesHeadroom);
}
+ ///
+ /// 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 4th label lands exactly on MaxLimit and
+ /// is never cut off by rounding.
+ ///
+ private void UpdateYAxis()
+ {
+ var maxVal = _pingValues.Where(p => !double.IsNaN(p.Value)).Select(p => p.Value).DefaultIfEmpty(0).Max();
+ if (!(maxVal > 0))
+ return;
+
+ var yAxis = PingYAxes[0];
+ var step = Math.Ceiling(maxVal * 1.2 / 3.0);
+ yAxis.MinStep = step;
+ yAxis.MaxLimit = step * 3;
+ }
+
#endregion
}
diff --git a/Source/NETworkManager/Views/BitCalculatorView.xaml b/Source/NETworkManager/Views/BitCalculatorView.xaml
index 64b8dd501b..dec4c9bf93 100644
--- a/Source/NETworkManager/Views/BitCalculatorView.xaml
+++ b/Source/NETworkManager/Views/BitCalculatorView.xaml
@@ -204,7 +204,7 @@
-
+
-
+
@@ -165,7 +165,7 @@
-
+
diff --git a/Source/NETworkManager/Views/DNSLookupView.xaml b/Source/NETworkManager/Views/DNSLookupView.xaml
index 450f7e4375..dc2ccd9028 100644
--- a/Source/NETworkManager/Views/DNSLookupView.xaml
+++ b/Source/NETworkManager/Views/DNSLookupView.xaml
@@ -183,7 +183,7 @@
-
+
@@ -194,7 +194,7 @@
-
+
diff --git a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml
index ffe9eb0929..a2ba0928f2 100644
--- a/Source/NETworkManager/Views/DiscoveryProtocolView.xaml
+++ b/Source/NETworkManager/Views/DiscoveryProtocolView.xaml
@@ -217,7 +217,7 @@
Style="{StaticResource ResourceKey=ButtonWithImageRectangle}">
+ Visual="{iconPacks:Material Kind=FileMoveOutline}" />
-
+
@@ -212,7 +212,7 @@
-
+
diff --git a/Source/NETworkManager/Views/HostsFileEditorView.xaml b/Source/NETworkManager/Views/HostsFileEditorView.xaml
index dc12172802..d2adbbf654 100644
--- a/Source/NETworkManager/Views/HostsFileEditorView.xaml
+++ b/Source/NETworkManager/Views/HostsFileEditorView.xaml
@@ -161,7 +161,7 @@
-
+
@@ -173,7 +173,7 @@
-
+
diff --git a/Source/NETworkManager/Views/IPGeolocationView.xaml b/Source/NETworkManager/Views/IPGeolocationView.xaml
index ea0f44c027..084305da81 100644
--- a/Source/NETworkManager/Views/IPGeolocationView.xaml
+++ b/Source/NETworkManager/Views/IPGeolocationView.xaml
@@ -299,7 +299,7 @@
-
+
-
+
@@ -451,7 +451,7 @@
-
+
diff --git a/Source/NETworkManager/Views/ListenersView.xaml b/Source/NETworkManager/Views/ListenersView.xaml
index d23d72d268..558afb85af 100644
--- a/Source/NETworkManager/Views/ListenersView.xaml
+++ b/Source/NETworkManager/Views/ListenersView.xaml
@@ -124,7 +124,7 @@
-
+
@@ -136,7 +136,7 @@
-
+
diff --git a/Source/NETworkManager/Views/LookupOUILookupView.xaml b/Source/NETworkManager/Views/LookupOUILookupView.xaml
index 58684519fd..62f18f2d57 100644
--- a/Source/NETworkManager/Views/LookupOUILookupView.xaml
+++ b/Source/NETworkManager/Views/LookupOUILookupView.xaml
@@ -126,7 +126,7 @@
-
+
@@ -137,7 +137,7 @@
-
+
diff --git a/Source/NETworkManager/Views/LookupPortLookupView.xaml b/Source/NETworkManager/Views/LookupPortLookupView.xaml
index 229f4f6946..0f6ae97cb7 100644
--- a/Source/NETworkManager/Views/LookupPortLookupView.xaml
+++ b/Source/NETworkManager/Views/LookupPortLookupView.xaml
@@ -133,7 +133,7 @@
-
+
@@ -144,7 +144,7 @@
-
+
diff --git a/Source/NETworkManager/Views/NeighborTableView.xaml b/Source/NETworkManager/Views/NeighborTableView.xaml
index 9ddb014fee..d1abab3bbf 100644
--- a/Source/NETworkManager/Views/NeighborTableView.xaml
+++ b/Source/NETworkManager/Views/NeighborTableView.xaml
@@ -154,7 +154,7 @@
-
+
@@ -166,7 +166,7 @@
-
+
diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml
index dac367acaa..ffbddcdcc1 100644
--- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml
+++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml
@@ -687,7 +687,7 @@
Style="{StaticResource ResourceKey=ButtonWithImageRectangle}">
+ Visual="{iconPacks:Material Kind=FileMoveOutline}" />
-
+
diff --git a/Source/NETworkManager/Views/PingMonitorView.xaml.cs b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
index 32f3f7c2ac..49c3e1c553 100644
--- a/Source/NETworkManager/Views/PingMonitorView.xaml.cs
+++ b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
@@ -35,6 +35,14 @@ public void Stop()
_viewModel.Stop();
}
+ ///
+ /// Releases resources held by the view model. Must be called when the host is removed.
+ ///
+ public void Cleanup()
+ {
+ _viewModel.Cleanup();
+ }
+
private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
Stop();
diff --git a/Source/NETworkManager/Views/PortScannerView.xaml b/Source/NETworkManager/Views/PortScannerView.xaml
index 45fed20bdd..54bb2151fa 100644
--- a/Source/NETworkManager/Views/PortScannerView.xaml
+++ b/Source/NETworkManager/Views/PortScannerView.xaml
@@ -274,7 +274,7 @@
-
+
@@ -285,7 +285,7 @@
-
+
diff --git a/Source/NETworkManager/Views/SNMPView.xaml b/Source/NETworkManager/Views/SNMPView.xaml
index 283800b3c5..cd62d56e7a 100644
--- a/Source/NETworkManager/Views/SNMPView.xaml
+++ b/Source/NETworkManager/Views/SNMPView.xaml
@@ -641,7 +641,7 @@
-
+
@@ -652,7 +652,7 @@
-
+
diff --git a/Source/NETworkManager/Views/SNTPLookupView.xaml b/Source/NETworkManager/Views/SNTPLookupView.xaml
index b1808aa5b8..47688067a6 100644
--- a/Source/NETworkManager/Views/SNTPLookupView.xaml
+++ b/Source/NETworkManager/Views/SNTPLookupView.xaml
@@ -160,7 +160,7 @@
-
+
@@ -173,7 +173,7 @@
-
+
diff --git a/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml b/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml
index 857e1b4302..e0d34d316d 100644
--- a/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml
+++ b/Source/NETworkManager/Views/SubnetCalculatorSubnettingView.xaml
@@ -187,7 +187,7 @@
-
+
@@ -198,7 +198,7 @@
-
+
diff --git a/Source/NETworkManager/Views/TracerouteView.xaml b/Source/NETworkManager/Views/TracerouteView.xaml
index 3aae2b0791..6d5bfa6183 100644
--- a/Source/NETworkManager/Views/TracerouteView.xaml
+++ b/Source/NETworkManager/Views/TracerouteView.xaml
@@ -376,7 +376,7 @@
-
+
@@ -388,7 +388,7 @@
-
+
diff --git a/Source/NETworkManager/Views/WiFiView.xaml b/Source/NETworkManager/Views/WiFiView.xaml
index 2dc53728aa..030faf1ecc 100644
--- a/Source/NETworkManager/Views/WiFiView.xaml
+++ b/Source/NETworkManager/Views/WiFiView.xaml
@@ -390,7 +390,7 @@
Fill="{DynamicResource MahApps.Brushes.Gray3}">
+ Visual="{iconPacks:Material Kind=FileMoveOutline}" />
@@ -405,7 +405,7 @@
Fill="{DynamicResource MahApps.Brushes.Gray3}">
+ Visual="{iconPacks:Material Kind=FileMoveOutline}" />
From 90a128eac180de2cee58096dd805c8e436a881b2 Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Sat, 30 May 2026 01:22:55 +0200
Subject: [PATCH 4/6] Fix: Possible memory leak
---
Source/NETworkManager/Views/PingMonitorView.xaml.cs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Source/NETworkManager/Views/PingMonitorView.xaml.cs b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
index 49c3e1c553..004d4e1749 100644
--- a/Source/NETworkManager/Views/PingMonitorView.xaml.cs
+++ b/Source/NETworkManager/Views/PingMonitorView.xaml.cs
@@ -40,6 +40,10 @@ public void Stop()
///
public void Cleanup()
{
+ // Release the app-lifetime subscription so this transient per-host view (and its
+ // view model) is not kept alive until the application shuts down.
+ Dispatcher.ShutdownStarted -= Dispatcher_ShutdownStarted;
+
_viewModel.Cleanup();
}
From e3d6ae1ae2312769031c70bd27e03f95205bed96 Mon Sep 17 00:00:00 2001
From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Date: Sat, 30 May 2026 13:14:09 +0200
Subject: [PATCH 5/6] Docs: Update screenshot
---
Source/GlobalAssemblyInfo.cs | 4 ++--
Website/docs/img/ping-monitor.png | Bin 47686 -> 85972 bytes
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Source/GlobalAssemblyInfo.cs b/Source/GlobalAssemblyInfo.cs
index ce0c39e606..4e5fde9f3b 100644
--- a/Source/GlobalAssemblyInfo.cs
+++ b/Source/GlobalAssemblyInfo.cs
@@ -6,5 +6,5 @@
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
-[assembly: AssemblyVersion("2026.5.24.0")]
-[assembly: AssemblyFileVersion("2026.5.24.0")]
+[assembly: AssemblyVersion("2026.5.30.0")]
+[assembly: AssemblyFileVersion("2026.5.30.0")]
diff --git a/Website/docs/img/ping-monitor.png b/Website/docs/img/ping-monitor.png
index f2e6e63c0b4500990f31b121a9890255a8ea5938..42548bf9b18efba92d861b6af4195d6503baf837 100644
GIT binary patch
literal 85972
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