From e13d6a78aafbcf32a4bb5f8581d041e1d057c3f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pol=C3=A1=C5=A1ek?= Date: Fri, 12 Dec 2025 02:05:01 +0100 Subject: [PATCH] CmdPal: Set image to surface immediately in BlurImageControl (#44222) ## Summary of the Pull Request This PR resolves issue when the background image is not loaded. When loading an image, BlurImageControl now sets the image to the surface immediately, as the LoadComplete handler is not guaranteed to be called. ## PR Checklist - [x] Closes: #44221 - [ ] **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 --- .../Controls/BlurImageControl.cs | 75 ++++++++++++++----- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/BlurImageControl.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/BlurImageControl.cs index 743e68d690..d77cab0645 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/BlurImageControl.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/BlurImageControl.cs @@ -368,32 +368,69 @@ internal sealed partial class BlurImageControl : Control { try { - if (imageSource is Microsoft.UI.Xaml.Media.Imaging.BitmapImage bitmapImage) + if (imageSource is not Microsoft.UI.Xaml.Media.Imaging.BitmapImage bitmapImage) { - _imageBrush ??= _compositor?.CreateSurfaceBrush(); - if (_imageBrush is null) - { - return; - } - - var loadedSurface = LoadedImageSurface.StartLoadFromUri(bitmapImage.UriSource); - loadedSurface.LoadCompleted += (_, _) => - { - if (_imageBrush is not null) - { - _imageBrush.Surface = loadedSurface; - _imageBrush.Stretch = ConvertStretch(ImageStretch); - _imageBrush.BitmapInterpolationMode = CompositionBitmapInterpolationMode.Linear; - } - }; - - _effectBrush?.SetSourceParameter(ImageSourceParameterName, _imageBrush); + return; } + + _imageBrush ??= _compositor?.CreateSurfaceBrush(); + if (_imageBrush is null) + { + return; + } + + Logger.LogDebug($"Starting load of BlurImageControl from '{bitmapImage.UriSource}'"); + var loadedSurface = LoadedImageSurface.StartLoadFromUri(bitmapImage.UriSource); + loadedSurface.LoadCompleted += OnLoadedSurfaceOnLoadCompleted; + SetLoadedSurfaceToBrush(loadedSurface); + _effectBrush?.SetSourceParameter(ImageSourceParameterName, _imageBrush); } catch (Exception ex) { Logger.LogError("Failed to load image for BlurImageControl: {0}", ex); } + + return; + + void OnLoadedSurfaceOnLoadCompleted(LoadedImageSurface loadedSurface, LoadedImageSourceLoadCompletedEventArgs e) + { + switch (e.Status) + { + case LoadedImageSourceLoadStatus.Success: + Logger.LogDebug($"BlurImageControl loaded successfully: has _imageBrush? {_imageBrush != null}"); + + try + { + SetLoadedSurfaceToBrush(loadedSurface); + } + catch (Exception ex) + { + Logger.LogError("Failed to set surface in BlurImageControl", ex); + throw; + } + + break; + case LoadedImageSourceLoadStatus.NetworkError: + case LoadedImageSourceLoadStatus.InvalidFormat: + case LoadedImageSourceLoadStatus.Other: + default: + Logger.LogError($"Failed to load image for BlurImageControl: Load status {e.Status}"); + break; + } + } + } + + private void SetLoadedSurfaceToBrush(LoadedImageSurface loadedSurface) + { + var surfaceBrush = _imageBrush; + if (surfaceBrush is null) + { + return; + } + + surfaceBrush.Surface = loadedSurface; + surfaceBrush.Stretch = ConvertStretch(ImageStretch); + surfaceBrush.BitmapInterpolationMode = CompositionBitmapInterpolationMode.Linear; } private static CompositionStretch ConvertStretch(Stretch stretch)