From 735ea01a939e2b64461dbc2305eea60932e2c366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pol=C3=A1=C5=A1ek?= Date: Tue, 24 Mar 2026 19:18:59 +0100 Subject: [PATCH] CmdPal: Fix dock popup XamlRoot handling on DockControl (#46305) ## Summary of the Pull Request This PR handles situations when app can crash because a popup control is being touched before XamlRoot is set. - Registers message handlers in DockControl only while controls are loaded. - Guards the edit-mode TeachingTip until the dock is rooted. - Sets XamlRoot for dock flyouts and tooltips before showing. - Ensures that tooltips in DockItemControl are set only after XamlRoot is explicitly set. - Unregisteres messages and CenterItems_CollectionChanged when unloaded. ## PR Checklist - [x] Closes: #46228 - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed --- .../Dock/DockControl.xaml.cs | 82 +++++++++++++++++-- .../Dock/DockItemControl.xaml.cs | 35 +++++++- 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Dock/DockControl.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Dock/DockControl.xaml.cs index 3b4249a8f6..dd0f6c75b5 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Dock/DockControl.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Dock/DockControl.xaml.cs @@ -67,15 +67,52 @@ public sealed partial class DockControl : UserControl, IRecipient(this); - WeakReferenceMessenger.Default.Register(this); - - ViewModel.CenterItems.CollectionChanged += CenterItems_CollectionChanged; + Loaded += DockControl_Loaded; + Unloaded += DockControl_Unloaded; // Start with edit mode disabled - normal click behavior UpdateEditMode(false); } + private void DockControl_Loaded(object sender, RoutedEventArgs e) + { + WeakReferenceMessenger.Default.UnregisterAll(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + + ViewModel.CenterItems.CollectionChanged -= CenterItems_CollectionChanged; + ViewModel.CenterItems.CollectionChanged += CenterItems_CollectionChanged; + + UpdateEditModeTeachingTip(); + } + + private void DockControl_Unloaded(object sender, RoutedEventArgs e) + { + WeakReferenceMessenger.Default.UnregisterAll(this); + + ViewModel.CenterItems.CollectionChanged -= CenterItems_CollectionChanged; + + if (EditButtonsTeachingTip.IsOpen) + { + EditButtonsTeachingTip.IsOpen = false; + } + + if (ContextMenuFlyout.IsOpen) + { + ContextMenuFlyout.Hide(); + } + + if (AddBandFlyout.IsOpen) + { + AddBandFlyout.Hide(); + } + + if (EditModeContextMenu.IsOpen) + { + EditModeContextMenu.Hide(); + } + } + private void CenterItems_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { UpdateCenterVisibility(); @@ -125,7 +162,38 @@ public sealed partial class DockControl : UserControl, IRecipient