From c2cf73ca9ea92e4a8d5da47839d37b553f1dd138 Mon Sep 17 00:00:00 2001 From: Paul Jenkins Date: Sun, 1 Mar 2026 08:24:05 +1100 Subject: [PATCH 1/3] Added a fallback image property to ImageBrushLoader --- AsyncImageLoader.Avalonia/ImageBrushLoader.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs index 2ce55b9..a936fa1 100644 --- a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs +++ b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs @@ -27,6 +27,14 @@ private static async void OnSourceChanged(ImageBrush imageBrush, AvaloniaPropert try { if (!string.IsNullOrWhiteSpace(newValue)) { bitmap = await AsyncImageLoader.ProvideImageAsync(newValue!); + } else { + var fallback = GetFallbackImage(imageBrush); + if (fallback != null) { + bitmap = fallback!; + imageBrush.Source = bitmap; + SetIsLoading(imageBrush, false); + return; + } } } catch (Exception e) { @@ -42,6 +50,17 @@ private static async void OnSourceChanged(ImageBrush imageBrush, AvaloniaPropert public static readonly AttachedProperty SourceProperty = AvaloniaProperty.RegisterAttached("Source", typeof(ImageLoader)); + public static readonly AttachedProperty FallbackImageProperty = + AvaloniaProperty.RegisterAttached("FallbackImage", typeof(Bitmap)); + + public static Bitmap? GetFallbackImage(ImageBrush element) { + return element.GetValue(FallbackImageProperty); + } + + public static void SetFallbackImage(ImageBrush element, Bitmap? value) { + element.SetValue(FallbackImageProperty, value); + } + public static string? GetSource(ImageBrush element) { return element.GetValue(SourceProperty); } From 9561f01dae95fe469fe322e297660c7ad5f8470d Mon Sep 17 00:00:00 2001 From: Paul Jenkins Date: Mon, 2 Mar 2026 08:34:21 +1100 Subject: [PATCH 2/3] PR Fixes Added XmlDoc --- AsyncImageLoader.Avalonia/ImageBrushLoader.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs index a936fa1..e171e95 100644 --- a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs +++ b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs @@ -50,13 +50,28 @@ private static async void OnSourceChanged(ImageBrush imageBrush, AvaloniaPropert public static readonly AttachedProperty SourceProperty = AvaloniaProperty.RegisterAttached("Source", typeof(ImageLoader)); - public static readonly AttachedProperty FallbackImageProperty = + /// + /// Attached property that provides a fallback to use when is null or empty. + /// + public static readonly AttachedProperty FallbackImageProperty = AvaloniaProperty.RegisterAttached("FallbackImage", typeof(Bitmap)); + /// + /// Gets the fallback attached to the specified . + /// Returns null if no fallback image has been set. + /// + /// The to read the fallback image from. + /// The fallback , or null if none is set. public static Bitmap? GetFallbackImage(ImageBrush element) { return element.GetValue(FallbackImageProperty); } + /// + /// Sets the fallback on the specified . + /// The fallback image is used when the value is null or empty. + /// + /// The to set the fallback image on. + /// The to use as the fallback public static void SetFallbackImage(ImageBrush element, Bitmap? value) { element.SetValue(FallbackImageProperty, value); } From 9e2d8cb8f739636c2ac5431bde04b5b06c5d4831 Mon Sep 17 00:00:00 2001 From: Paul Jenkins Date: Mon, 2 Mar 2026 08:43:48 +1100 Subject: [PATCH 3/3] PR fix: Checks for null of both bitmap and fallback before assigning --- AsyncImageLoader.Avalonia/ImageBrushLoader.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs index e171e95..9e7211c 100644 --- a/AsyncImageLoader.Avalonia/ImageBrushLoader.cs +++ b/AsyncImageLoader.Avalonia/ImageBrushLoader.cs @@ -25,17 +25,11 @@ private static async void OnSourceChanged(ImageBrush imageBrush, AvaloniaPropert Bitmap? bitmap = null; try { - if (!string.IsNullOrWhiteSpace(newValue)) { + if (!string.IsNullOrWhiteSpace(newValue)) bitmap = await AsyncImageLoader.ProvideImageAsync(newValue!); - } else { - var fallback = GetFallbackImage(imageBrush); - if (fallback != null) { - bitmap = fallback!; - imageBrush.Source = bitmap; - SetIsLoading(imageBrush, false); - return; - } - } + + if (bitmap == null && GetFallbackImage(imageBrush) is Bitmap fallback) + bitmap = fallback; } catch (Exception e) { Logger?.Log("ImageBrushLoader", "ImageBrushLoader image resolution failed: {0}", e);