diff --git a/native/Avalonia.Native/src/OSX/automation.mm b/native/Avalonia.Native/src/OSX/automation.mm index a6ae754c43..7897a76973 100644 --- a/native/Avalonia.Native/src/OSX/automation.mm +++ b/native/Avalonia.Native/src/OSX/automation.mm @@ -274,6 +274,20 @@ } } +- (BOOL)accessibilityIsAttributeSettable:(NSAccessibilityAttributeName)attribute +{ + if ([attribute isEqualToString:NSAccessibilityValueAttribute]) + { + if (_peer->IsValueProvider()) + return !_peer->ValueProvider_IsReadOnly(); + if (_peer->IsRangeValueProvider()) + return YES; + return NO; + } + + return [super accessibilityIsAttributeSettable:attribute]; +} + - (id)accessibilityMinValue { if (_peer->IsRangeValueProvider()) diff --git a/src/Avalonia.Native/AvnAutomationPeer.cs b/src/Avalonia.Native/AvnAutomationPeer.cs index 659ba78200..4a679e3ed7 100644 --- a/src/Avalonia.Native/AvnAutomationPeer.cs +++ b/src/Avalonia.Native/AvnAutomationPeer.cs @@ -201,6 +201,7 @@ namespace Avalonia.Native public int IsValueProvider() => IsProvider(); public IAvnString? ValueProvider_GetValue() => ValueProvider.Value.ToAvnString(); public void ValueProvider_SetValue(string value) => ValueProvider.SetValue(value); + public int ValueProvider_IsReadOnly() => ValueProvider.IsReadOnly.AsComBool(); [return: NotNullIfNotNull("peer")] public static AvnAutomationPeer? Wrap(AutomationPeer? peer) diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl index 1b9ee376c6..a1b57f7d14 100644 --- a/src/Avalonia.Native/avn.idl +++ b/src/Avalonia.Native/avn.idl @@ -1329,6 +1329,7 @@ interface IAvnAutomationPeer : IUnknown bool IsValueProvider(); IAvnString* ValueProvider_GetValue(); void ValueProvider_SetValue([const] char* value); + bool ValueProvider_IsReadOnly(); IAvnString* GetHelpText(); IAvnString* GetPlaceholderText();