diff options
author | Samantha Houts <samantha@teamredwall.com> | 2017-01-31 11:49:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-31 11:49:15 -0800 |
commit | ae59382c9046501edb37882ad1c065aacce60319 (patch) | |
tree | 3578ce8e0396a38aeb8323d4051f50a19a5340fb /Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs | |
parent | 23d228039acc504049f6a5153f5839d4c714930a (diff) | |
download | xamarin-forms-ae59382c9046501edb37882ad1c065aacce60319.tar.gz xamarin-forms-ae59382c9046501edb37882ad1c065aacce60319.tar.bz2 xamarin-forms-ae59382c9046501edb37882ad1c065aacce60319.zip |
[All] Basic Accessibility Support (#713)
* [Core] Add accessibility properties
* [Controls] Add accessibility gallery
* [iOS] Implement accessibility properties
* [Android] Implement accessibilty properties
* [Win] Implement accessibility properties
* [Win] Select ListView item on selected for a11y
* Update docs
* TODO: macOS accessibility
* [iOS] Fix failing UI Tests
Diffstat (limited to 'Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs b/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs index b81f73e3..402d1da8 100644 --- a/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Automation; +using Windows.UI.Xaml.Automation.Peers; using Windows.UI.Xaml.Controls; #if WINDOWS_UWP @@ -17,6 +18,10 @@ namespace Xamarin.Forms.Platform.WinRT public class VisualElementRenderer<TElement, TNativeElement> : Panel, IVisualElementRenderer, IDisposable, IEffectControlProvider where TElement : VisualElement where TNativeElement : FrameworkElement { + string _defaultAutomationPropertiesName; + AccessibilityView? _defaultAutomationPropertiesAccessibilityView; + string _defaultAutomationPropertiesHelpText; + UIElement _defaultAutomationPropertiesLabeledBy; bool _disposed; EventHandler<VisualElementChangedEventArgs> _elementChangedHandlers; VisualElementTracker<TElement, TNativeElement> _tracker; @@ -108,6 +113,11 @@ namespace Xamarin.Forms.Platform.WinRT return new SizeRequest(result); } + public UIElement GetNativeElement() + { + return Control; + } + public void SetElement(VisualElement element) { TElement oldElement = Element; @@ -287,6 +297,14 @@ namespace Xamarin.Forms.Platform.WinRT UpdateEnabled(); else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName) UpdateBackgroundColor(); + else if (e.PropertyName == Accessibility.HintProperty.PropertyName) + SetAutomationPropertiesHelpText(); + else if (e.PropertyName == Accessibility.NameProperty.PropertyName) + SetAutomationPropertiesName(); + else if (e.PropertyName == Accessibility.IsInAccessibleTreeProperty.PropertyName) + SetAutomationPropertiesAccessibilityView(); + else if (e.PropertyName == Accessibility.LabeledByProperty.PropertyName) + SetAutomationPropertiesLabeledBy(); } protected virtual void OnRegisterEffect(PlatformEffect effect) @@ -300,6 +318,75 @@ namespace Xamarin.Forms.Platform.WinRT SetValue(AutomationProperties.AutomationIdProperty, id); } + protected virtual void SetAutomationPropertiesName() + { + if (Element == null || Control == null) + return; + + if (_defaultAutomationPropertiesName == null) + _defaultAutomationPropertiesName = (string)Control.GetValue(AutomationProperties.NameProperty); + + var elemValue = (string)Element.GetValue(Accessibility.NameProperty); + + if (!string.IsNullOrWhiteSpace(elemValue)) + Control.SetValue(AutomationProperties.NameProperty, elemValue); + else + Control.SetValue(AutomationProperties.NameProperty, _defaultAutomationPropertiesName); + } + + protected virtual void SetAutomationPropertiesAccessibilityView() + { + if (Element == null || Control == null) + return; + + if (!_defaultAutomationPropertiesAccessibilityView.HasValue) + _defaultAutomationPropertiesAccessibilityView = (AccessibilityView)Control.GetValue(AutomationProperties.AccessibilityViewProperty); + + var newValue = _defaultAutomationPropertiesAccessibilityView; + var elemValue = (bool?)Element.GetValue(Accessibility.IsInAccessibleTreeProperty); + + if (elemValue == true) + newValue = AccessibilityView.Content; + else if (elemValue == false) + newValue = AccessibilityView.Raw; + + Control.SetValue(AutomationProperties.AccessibilityViewProperty, newValue); + } + + protected virtual void SetAutomationPropertiesHelpText() + { + if (Element == null || Control == null) + return; + + if (_defaultAutomationPropertiesHelpText == null) + _defaultAutomationPropertiesHelpText = (string)Control.GetValue(AutomationProperties.HelpTextProperty); + + var elemValue = (string)Element.GetValue(Accessibility.HintProperty); + + if (!string.IsNullOrWhiteSpace(elemValue)) + Control.SetValue(AutomationProperties.HelpTextProperty, elemValue); + else + Control.SetValue(AutomationProperties.HelpTextProperty, _defaultAutomationPropertiesHelpText); + } + + protected virtual void SetAutomationPropertiesLabeledBy() + { + if (Element == null || Control == null) + return; + + if (_defaultAutomationPropertiesLabeledBy == null) + _defaultAutomationPropertiesLabeledBy = (UIElement)Control.GetValue(AutomationProperties.LabeledByProperty); + + var elemValue = (VisualElement)Element.GetValue(Accessibility.LabeledByProperty); + var renderer = elemValue?.GetOrCreateRenderer(); + var nativeElement = renderer?.GetNativeElement(); + + if (nativeElement != null) + Control.SetValue(AutomationProperties.LabeledByProperty, nativeElement); + else + Control.SetValue(AutomationProperties.LabeledByProperty, _defaultAutomationPropertiesLabeledBy); + } + protected void SetNativeControl(TNativeElement control) { TNativeElement oldControl = Control; @@ -367,6 +454,10 @@ namespace Xamarin.Forms.Platform.WinRT protected virtual void UpdateNativeControl() { UpdateEnabled(); + SetAutomationPropertiesHelpText(); + SetAutomationPropertiesName(); + SetAutomationPropertiesAccessibilityView(); + SetAutomationPropertiesLabeledBy(); } internal virtual void OnElementFocusChangeRequested(object sender, VisualElement.FocusRequestArgs args) |