Fix #916 — Memory tab tooltip stops working after returning to tab#919
Merged
Conversation
WPF Popup with PlacementTarget = chart can wedge when the user navigates away from a TabItem mid-hover: TabControl unloads the parent without firing MouseLeave on the chart, so _popup.IsOpen stays true with a stale anchor. On return, OnMouseMove sets IsOpen = true but it is already true — the assignment is a no-op and the popup never re-anchors or appears. Memory tab is the most visible victim because it has 6 charts inside a nested TabControl, multiplying the chance of a wedged popup, but the bug is general to ChartHoverHelper. - Force _popup.IsOpen = false on chart Loaded / Unloaded / IsVisibleChanged. - In OnMouseMove, toggle IsOpen off then on so WPF re-evaluates placement even when the popup believes it is already open. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 2, 2026
erikdarlingdata
added a commit
that referenced
this pull request
May 6, 2026
) PR #919 / #921 / #922 addressed the WPF Popup wedge but missed the underlying bug: MemoryContent, ResourceMetricsContent, and QueryPerformanceContent all called DisposeChartHelpers() from their per-control Unloaded event handler. WPF fires Unloaded on every TabControl tab switch, not just on destruction, so switching away from the Memory tab unsubscribed every chart's MouseMove handlers — which were never re-registered when the user came back. The popup-wedge fixes were running inside helpers that had already torn themselves down. ServerTab_Unloaded had the same comment warning future maintainers, but the inner UserControls didn't follow that rule. Changes: - MemoryContent / ResourceMetricsContent / QueryPerformanceContent: drop DisposeChartHelpers() (and ThemeManager unsubscribe) from the tab-switch Unloaded handler. Move the ThemeManager unsubscribe into DisposeChartHelpers() so it runs only on real cleanup. - SystemEventsContent: same pattern — add a DisposeChartHelpers() method that disposes the 19 hover helpers, unsubscribes filter-popup events, and unsubscribes ThemeManager. Empty out OnUnloaded. - ServerTab.CleanupOnClose: add SystemEventsContent.DisposeChartHelpers() to the cleanup chain (its hovers leaked on tab close before this). Final disposal still happens correctly via ServerTab.CleanupOnClose, which only fires when a server tab is actually removed. Lite is unaffected — its Unloaded handler never disposed hovers. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Popup(used byChartHoverHelper) can wedge when the user navigates away from aTabItemmid-hover:TabControlunloads the parent without firingMouseLeave, soIsOpenstaystruewith a stale placement anchor. On return,OnMouseMovesetsIsOpen = trueagain, but since it is alreadytruethe assignment is a no-op and the popup never re-anchors or appears.TabControl, but the underlying bug is in the shared helper.Loaded/Unloaded/IsVisibleChanged, and toggleIsOpenoff→on insideOnMouseMoveso WPF re-evaluates placement even when the popup believes it is already open.Fixes #916
Test plan
🤖 Generated with Claude Code