Skip to content

Fix #916 (Lite) — Memory tab tooltip stops working after returning to tab#921

Merged
erikdarlingdata merged 1 commit into
devfrom
feature/916-lite-memory-tab-tooltip
May 2, 2026
Merged

Fix #916 (Lite) — Memory tab tooltip stops working after returning to tab#921
erikdarlingdata merged 1 commit into
devfrom
feature/916-lite-memory-tab-tooltip

Conversation

@erikdarlingdata
Copy link
Copy Markdown
Owner

Summary

  • Mirrors Dashboard PR Fix #916 — Memory tab tooltip stops working after returning to tab #919 for the Lite collector. WPF Popup (used by Lite's ChartHoverHelper) can wedge when the user navigates away from a TabItem mid-hover: WPF unloads the parent without firing MouseLeave, so IsOpen stays true with a stale placement anchor. On return, OnMouseMove sets IsOpen = true again, but since it's already true the assignment is a no-op and the popup never re-anchors or appears.
  • Lite has the same nested-TabControl shape (parent Memory tab → Memory Overview / Memory Clerks / Memory Grants / Memory Pressure Events sub-tabs), so the bug surfaces identically to the Full Dashboard.
  • Force-close the popup on chart Loaded / Unloaded / IsVisibleChanged, and toggle IsOpen off→on inside OnMouseMove so WPF re-evaluates placement even when the popup believes it's already open.

Related to #916

Test plan

  • Build Lite
  • Switch between top-level tabs that own charts and verify tooltip still appears on return
  • Repeat across all Memory sub-tabs (Memory Overview, Memory Clerks, Memory Grants, Memory Pressure Events)
  • Sanity-check tooltips still behave on other Lite tabs that use ChartHoverHelper

🤖 Generated with Claude Code

… tab

Mirrors Dashboard fix in 4e58e8a. WPF Popup with PlacementTarget = chart
can wedge when the user navigates away from a TabItem mid-hover: WPF
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.

Lite has the same nested TabControl pattern (parent Memory tab hosting
Memory Overview / Memory Clerks / Memory Grants / Memory Pressure Events
sub-tabs) so the bug surfaces the same way.

- 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>
@erikdarlingdata erikdarlingdata merged commit b9361f3 into dev May 2, 2026
1 of 2 checks passed
@erikdarlingdata erikdarlingdata deleted the feature/916-lite-memory-tab-tooltip branch May 2, 2026 14:38
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant