summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs
diff options
context:
space:
mode:
authorSamantha Houts <samantha@teamredwall.com>2017-01-31 11:49:15 -0800
committerGitHub <noreply@github.com>2017-01-31 11:49:15 -0800
commitae59382c9046501edb37882ad1c065aacce60319 (patch)
tree3578ce8e0396a38aeb8323d4051f50a19a5340fb /Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs
parent23d228039acc504049f6a5153f5839d4c714930a (diff)
downloadxamarin-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.cs91
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)