Skip to content

Fix #916 — Memory tab tooltip stops working after returning to tab#919

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

Fix #916 — Memory tab tooltip stops working after returning to tab#919
erikdarlingdata merged 1 commit into
devfrom
feature/916-memory-tab-tooltip

Conversation

@erikdarlingdata
Copy link
Copy Markdown
Owner

Summary

  • WPF Popup (used by ChartHoverHelper) can wedge when the user navigates away from a TabItem mid-hover: TabControl 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 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 hosts 6 charts inside a nested TabControl, but the underlying bug is in the shared helper.
  • 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 is already open.

Fixes #916

Test plan

  • Open Dashboard → Overview → Resource Overview → confirm tooltip appears
  • Switch to Memory → Memory Overview → confirm tooltip appears
  • Switch back to Overview → Resource Overview → tooltip still works
  • Switch back to Memory → Memory Overview → tooltip works (regression scenario from issue)
  • Repeat across all Memory sub-tabs (Memory Grants, Memory Clerks, Plan Cache, Memory Pressure Events)
  • Sanity-check tooltips still behave on other tabs that use ChartHoverHelper (Resource Metrics, System Events, Queries history windows)

🤖 Generated with Claude Code

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>
@erikdarlingdata erikdarlingdata merged commit 4e58e8a into dev May 2, 2026
2 checks passed
@erikdarlingdata erikdarlingdata deleted the feature/916-memory-tab-tooltip branch May 2, 2026 14:26
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