Clear icon is different between input controls and also margin and padding looks different.
Make sure the input controls share same look and feel across platforms.
Component: SignaturePad
Version: Telerik UI for .NET MAUI 12.0.0 .NET: .NET 10 / .NET MAUI
Platform: Reproduced on iOS (iPad, iPhone) and Android (Samsung). Cross-platform — bug is in the shared SingleTouchSegmentProvider, not in a platform-specific touch handler.
RadSignaturePad crashes the app with an unhandled InvalidOperationException: "Sequence contains no elements" thrown from the touch event pipeline. Because the exception originates inside the native→managed touch callback, it cannot be caught by user code and propagates to AppDomain.CurrentDomain.UnhandledException, terminating the app.
The root cause is a .Last() call on an empty segment collection inside SingleTouchSegmentProvider.OnTouch. The crash occurs in both TouchesMoved and TouchesEnded paths, indicating a missing guard at the central OnTouch entry point — not in a specific touch phase.
RadSignaturePad and a separate button that invokes signaturePad.ClearCommand.→ TouchesMoved fires after ClearCommand has emptied the internal segment collection. SingleTouchSegmentProvider.OnTouch calls .Last() on the empty collection and throws.
Reproduced on:
The same crash also occurs on TouchesEnded in less deterministic scenarios — palm rejection, multi-touch cancellation, Apple Pencil hover-to-touch transitions, or a touch that begins outside the view and ends inside it. All of these can deliver a touch event without a corresponding active segment. We've observed this variant in production on iPad but could not reliably reproduce it in isolation.
System.InvalidOperationException: Sequence contains no elements
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Last[Segment](IEnumerable`1 source)
at Telerik.Maui.Controls.SignaturePad.SingleTouchSegmentProvider.OnTouch(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignaturePad.SegmentProvider.TouchRecognizer_Touch(Object sender, InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignatureView.OnTouch(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignatureViewHandler.<ConnectHandler>b__3_0(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.FireEvent(InteractionAction actionType, UITouch touch)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.TouchesMoved(NSSet touches, UIEvent evt)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.__Registrar_Callbacks__.callback_1171_..._TouchesMoved(IntPtr pobj, IntPtr sel, IntPtr p0, IntPtr p1, IntPtr* exception_gchandle)
System.InvalidOperationException: Sequence contains no elements
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Last[Segment](IEnumerable`1 source)
at Telerik.Maui.Controls.SignaturePad.SingleTouchSegmentProvider.OnTouch(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignaturePad.SegmentProvider.TouchRecognizer_Touch(Object sender, InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignatureView.OnTouch(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignatureViewHandler.<ConnectHandler>b__3_0(InteractionAdapterEventArgs args)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.FireEvent(InteractionAction actionType, UITouch touch)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.TouchesEnded(NSSet touches, UIEvent evt)
at Telerik.Maui.Controls.SignaturePad.SignatureViewTouchHandler.__Registrar_Callbacks__.callback_1162_..._TouchesEnded(IntPtr pobj, IntPtr sel, IntPtr p0, IntPtr p1, IntPtr* exception_gchandle)
<telerik:RadSignaturePad
x:Name="signaturePad"
StrokeThickness="5"
StrokeColor="Black"
BackgroundColor="White" />
<Button Text="Clear" Clicked="OnClearClicked" />
void OnClearClicked(object s, EventArgs e)
{
if (signaturePad.ClearCommand.CanExecute(null))
signaturePad.ClearCommand.Execute(null);
}
No custom touch handlers, no SegmentProvider override, no gestures attached.
SingleTouchSegmentProvider.OnTouch should guard against an empty segment collection (e.g. .LastOrDefault() + null check, or an early return when no active segment exists). Touch events arriving after a Clear — or without a preceding TouchesBegan — should be ignored, not throw.
We disable the Clear button while a stroke is active (toggled in StrokeStarted / StrokeCompleted). This closes the deterministic repro but does not cover the non-deterministic TouchesEnded cases (palm rejection etc.), which still crash. A fix in SingleTouchSegmentProvider.OnTouch is required.
App crash on a customer-visible workflow (digital signature capture on service tickets). Affects production users on iPads, iPhones, and Android devices.
SignatureViewTouchHandler or SegmentProvider so we can guard OnTouch from user code?After upgrading from Telerik UI for .NET MAUI 13.0.0 → 13.2.0, a NullReferenceException is thrown inside SchedulerAgendaView.Init() on Windows (WinUI3) whenever a RadScheduler with an AgendaViewDefinition is used. The scheduler never renders and the app receives an unhandled exception.
Steps to Reproduce:
ContentPage (or any page) with a RadScheduler in XAML, including at least one AgendaViewDefinition in ViewDefinitions:<telerik:RadScheduler AppointmentsSource="{Binding Appointments}">
<telerik:RadScheduler.ViewDefinitions>
<telerik:AgendaViewDefinition />
<telerik:DayViewDefinition />
</telerik:RadScheduler.ViewDefinitions>
</telerik:RadScheduler>
Expected Behavior:
The scheduler renders correctly with the AgendaViewDefinition, as it did in 13.0.0.
Actual Behavior:
An unhandled NullReferenceException is thrown:
System.NullReferenceException: Object reference not set to an instance of an object.
at Telerik.Maui.Controls.Scheduler.SchedulerAgendaView.Init()
at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__124_0(Object state)
at Microsoft.UI.Dispatching.DispatcherQueueSynchronizationContext.<>c__DisplayClass2_0.<Post>b__0()
Root Cause Analysis (via ILSpy decompilation):
Comparing the decompiled assemblies of 13.0.0 and 13.2.0 reveals a new override in RadScheduler introduced in 13.2.0:
// NEW in 13.2.0 — not present in 13.0.0:
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == "Parent" && Parent != null && !IsLoaded)
UpdateActiveViewDefinition();
}
This causes the following call chain to be triggered during InitializeComponent() in the page constructor — before the page is attached to a window:
RadScheduler to the page → Parent property changesOnPropertyChanged("Parent") fires → UpdateActiveViewDefinition() is calledActiveViewDefinition = ViewDefinitions[0] (the AgendaViewDefinition)OnActiveViewDefinitionChanged() → content.Rebuild() (template already applied on WinUI3)SchedulerAgendaView.Model setter → Init() is called as async voidInit(), after the first await, the continuation runs and DataBindingComplete firescompleteHandler inside Init() calls:((BindableObject)this).Dispatcher.Dispatch(async delegate { ... });
Dispatcher is null because the SchedulerAgendaView is not yet attached to a window → NullReferenceExceptionThe exception is captured by the async void state machine and re-thrown via SynchronizationContext.ThrowAsync → DispatcherQueueSynchronizationContext.Post, which matches the observed stack trace exactly.
Why it worked in 13.0.0: UpdateActiveViewDefinition() was never called from OnPropertyChanged. It was only invoked after IsLoaded = true, at which point Dispatcher is guaranteed to be non-null.
Why the condition !IsLoaded is insufficient: Parent != null does not imply a window is present. During InitializeComponent(), the element has a parent in the logical tree but is not yet attached to any Window, making Dispatcher null on BindableObject.
Workaround:
Do not declare ViewDefinitions in XAML. Instead, add them programmatically in the page's Loaded event handler, at which point Dispatcher is guaranteed to be available:
private void OnPageLoaded(object sender, EventArgs e)
{
if (scheduler.ViewDefinitions.Count == 0)
{
scheduler.ViewDefinitions.Add(new AgendaViewDefinition());
scheduler.ViewDefinitions.Add(new DayViewDefinition());
scheduler.ViewDefinitions.Add(new WeekViewDefinition());
scheduler.ViewDefinitions.Add(new MonthViewDefinition());
}
}
Suggested Fix:
Either:
Option A — Guard Dispatcher usage inside SchedulerAgendaView.Init():
// In completeHandler, before calling Dispatch:
if (((BindableObject)this).Dispatcher is { } dispatcher)
dispatcher.Dispatch(...);
Option B — Guard UpdateActiveViewDefinition() in RadScheduler.OnPropertyChanged to only run when content (the internal RadSchedulerContent) has already been set (i.e., template was applied):
if (propertyName == "Parent" && Parent != null && !IsLoaded && content != null)
UpdateActiveViewDefinition();
Option B is more conservative and closer to the original 13.0.0 behavior, since content being non-null implies the template has been applied and Dispatcher is available.
Environment:
| Telerik UI for .NET MAUI | 13.2.0 (regression from 13.0.0) |
| .NET | .NET 10 |
| Platform | Windows (WinUI3) |
| MAUI | 10.0.60 |
Right to left flow direction completely breaks the RadDataGrid on Android and on iOS it doesn't seem to do anything.
Repro steps:
Android:
iOS:
If you test this on Windows, the FlowDirection is being appropriately applied.
Android LTR:
RTL:
when building an app without explicitly setting the target platform, the following error appears:
The type or namespace name 'Compatibility' does not exist in the namespace 'Telerik.Maui.Controls' (are you missing an assembly reference?)
The Telerik.Maui.Controls.Compatibility dll is missing from the .net9/10 shared folders
Hi,
Do you have on your roadmap to include a Shimmer View / Control as part of your .NET MAUI offerings to tidy up a screen loading indication.
From a UI/UX perspective, a shimmer sits better with our user community rather than a loading indicator.
Thank you,
Shane
It seems the issue happens randomly -> crashes on a Windows 19 Server while running a basic Windows Maui app.
There is a public bug report: https://github.com/mono/SkiaSharp/issues/3168
The Bottom Sheet component provides an intuitive way to display additional content to the users. It appears on the bottom of a screen as an overlay and presents users with a choice of actions that they must take.
When navigating to a page with a RadRichTextEditor, it sometimes pops up an error on page load. It is inconsistent, but I attached an example gif. The xaml on the page I'm navigating to is basic:
<Grid Margin="20">
I believe this problem started with MAUI version 9.0.70. Possibly with one of these changes:
https://github.com/dotnet/maui/pull/27003/files
https://github.com/dotnet/maui/pull/28354/files
Provide an AI assistant for code generation with the Telerik MAUI controls.
Telerik Blazor released such assistant https://www.telerik.com/blazor-ui/documentation/ai/overview
add a button control in which you can swipe its content
I have a user who reported a crash. In Sentry, I see this:
System.NullReferenceException: Object reference not set to an instance of an object.
?, in void TelerikLicense.ShowLicenseMessage(Page page)
?, in void TelerikLicense.VerifyLicense(Element element)+() => { }
?, in void TelerikLicense.ExecuteActionOnLoaded(Page page, Action action)
?, in void TelerikLicense.VerifyLicense(Element element)
?, in object <InitializeComponent>_anonXamlCDataTemplate_21.LoadDataTemplate()
?, in object ElementTemplate.CreateContent()
?, in void BindableLayoutController.CreateChildren()
?, in NotifyCollectionChangedAction NotifyCollectionChangedEventArgsExtensions.Apply(NotifyCollectionChangedEventArgs self, Action<object, int, bool> insert, Action<object, int> removeAt, Action reset)
?, in void BindableLayoutController.ItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
?, in void WeakNotifyCollectionChangedProxy.OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
File "ObservableCollection.cs", line 192, in void ObservableCollection<T>.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
handler(this, e);
?, in void ExtObservableCollection<T>.RaiseCollectionChanged()
the app was built with a successful license-check
Telerik.Licensing 1.6.6