Product / versions
Telerik UI for .NET MAUI 15.1.0 (also reproduced with 15.0.0)
.NET MAUI 11.0.0-rc.2.26505.5 (SDK 11.0.100-rc.2.26504.105), iOS 26.5 and iOS 27.0 (simulator, Xcode 27.0)
Works with .NET MAUI 11.0.0-rc.1.26451.6; Android is not affected
Symptom
On iOS, any RadBorder, RadEffectsView or RadTemplatedButton whose fill comes from Background (a SolidColorBrush, e.g. Background="Orange") renders with no fill. Setting BackgroundColor instead still works. Since RadTemplatedButtonStyle sets Background, templated buttons lose their fill too.
Root cause (from decompiling both assemblies)
RadBorderHandler.BorderMapper (iOS) maps "BackgroundColor" to MapBackgroundColor, which calls RadBorderExtensions.UpdateBackgroundColor:
tkBorder.BackgroundColor = RadMauiCoreHelper.ToUIColor(border.BackgroundColor);
When only Background is set, border.BackgroundColor is null, so this clears UIView.BackgroundColor.
The "Background" key, inherited from ViewHandler.ViewMapper, runs earlier in the same property pass. UIView.UpdateBackground paints a SolidPaint by setting the same UIView.BackgroundColor, which step 1 then wipes.
Up to MAUI rc.1, Controls remapped "BackgroundImageSource" to handler.UpdateValue("Background"). That ran later in the pass and repainted the brush, which hid the problem. In rc.2 (VisualElement.MapBackgroundImageSourceForControls) the redirect is skipped once "Background" has already run in the bulk pass (PropertyMapperPassScope.IsRedundantBulkPassRedirect), so the overwrite now sticks.
On Android, UpdateBackground and UpdateBackgroundColor both rebuild the same BorderDrawable from the whole IRadBorder, so the order of the keys does not matter there.
Repro
<telerik:RadBorder Background="Orange" HeightRequest="80" CornerRadius="8" />
<telerik:RadTemplatedButton Content="Login" Background="Orange" />
Run on iOS with MAUI 11 rc.2: both are transparent. With BackgroundColor="Orange" they render correctly.
Suggested fix
In the iOS MapBackgroundColor (or UpdateBackgroundColor), do not overwrite the native background when IView.Background is a non-empty paint. Alternatively, resolve both properties in one place, as the Android handler does.
Workaround we use
#if IOS
RadBorderHandler.BorderMapper.AppendToMapping(
nameof(VisualElement.BackgroundColor),
static (handler, border) =>
{
if (border.Background is SolidPaint)
{
Microsoft.Maui.Platform.ViewExtensions.UpdateBackground(handler.PlatformView, border);
}
});
#endif
Possibly related (pre-existing, also on rc.1)
TKBorderView derives from MauiView, not LayoutView/ContentView. So UIView.UpdateBackground(null) returns early without clearing UIView.BackgroundColor. If Background goes from a brush to null at runtime while BackgroundColor is null, the old fill stays on screen.
After upgrading to .NET MAUI 10.0.60, the app crashes on Windows with an unhandled exception when RadCollectionView renders items that use a ControlTemplate containing a RadBorder.
Exception:
System.Exception: Keine installierten Komponenten gefunden. (REGDB_E_CLASSNOTREG)
at ABI.System.Collections.Generic.IListMethods`2.AppendDynamic(...)
at Microsoft.UI.Xaml.Controls.UIElementCollection.Add(UIElement item)
at Telerik.Maui.RadBorderExtensions.UpdateBorderContent(Border nativeBorder, IRadBorder border)
at Telerik.Maui.Handlers.RadBorderHandler.MapContent(...)
at Telerik.Maui.Controls.RadCollectionViewItemView.OnStyleChanged()
...
Root Cause:
MAUI PR #30047 introduced a call to view.Handler?.DisconnectHandler() inside ContentViewHandler.UpdateContent (Windows-only) before re-adding the content to the native panel. This disconnects and invalidates Telerik's RadBorderHandler WinRT object references. When RadBorderExtensions.UpdateBorderContent subsequently calls UIElementCollection.Add, the WinRT interop throws the COM error.
Steps to reproduce:
RadCollectionView with an ItemTemplate or ControlTemplate that contains a RadBorderExpected: Collection renders correctly.
Actual: App crashes with REGDB_E_CLASSNOTREG.
Versions:
Workaround:
Replacing the default ContentViewHandler mapping with a custom implementation that calls platformView.RemoveFromParent() on the native view instead of DisconnectHandler() on the virtual view avoids the crash.
Color fades on scale transition to minimize or maximize other than 100% when corner radius is set to specific values. For example:
1,0,0,1,
1,1,0,0,
0,1,1,0
0,0,0,1, etc