diff --git a/A11YTools/A11YTools.Android/AndroidA11yService.cs b/A11YTools/A11YTools.Android/AndroidA11yService.cs index bfc649e..495b79c 100644 --- a/A11YTools/A11YTools.Android/AndroidA11yService.cs +++ b/A11YTools/A11YTools.Android/AndroidA11yService.cs @@ -65,7 +65,7 @@ public void SetFocus(VisualElement element) var renderer = Platform.GetRenderer(element); var view = element.GetViewForAccessibility(); - view?.SendAccessibilityEvent(EventTypes.ViewAccessibilityFocused); + view?.SendAccessibilityEvent(EventTypes.ViewFocused); } public void SetAnnouncement(string text) diff --git a/A11YTools/A11YTools.UWP/A11YTools.UWP.csproj b/A11YTools/A11YTools.UWP/A11YTools.UWP.csproj index 1a165f8..968f7cd 100644 --- a/A11YTools/A11YTools.UWP/A11YTools.UWP.csproj +++ b/A11YTools/A11YTools.UWP/A11YTools.UWP.csproj @@ -90,6 +90,7 @@ true + App.xaml @@ -98,6 +99,7 @@ + @@ -162,4 +164,9 @@ 14.0 + + + + + \ No newline at end of file diff --git a/A11YTools/A11YTools.UWP/AccessibleFocusBlockRenderer.cs b/A11YTools/A11YTools.UWP/AccessibleFocusBlockRenderer.cs new file mode 100644 index 0000000..b250ba0 --- /dev/null +++ b/A11YTools/A11YTools.UWP/AccessibleFocusBlockRenderer.cs @@ -0,0 +1,86 @@ +using A11YTools.UWP; +using A11YTools.Views; +using System.ComponentModel; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Xamarin.Forms.Platform.UWP; + +[assembly: ExportRenderer(typeof(AccessibleFocusBlock), typeof(AccessibleFocusBlockRenderer))] +namespace A11YTools.UWP +{ + public class AccessibleFocusBlockRenderer : ViewRenderer + { + private Windows.UI.Xaml.Controls.Button accessibilityHiddenBtn = null; + + protected override void OnElementChanged(ElementChangedEventArgs e) + { + base.OnElementChanged(e); + + if (e.OldElement != null && accessibilityHiddenBtn != null) + { + accessibilityHiddenBtn.Click -= AccessibilityHiddenBtn_Click; + accessibilityHiddenBtn.GotFocus -= AccessibilityHiddenBtn_GotFocus; + accessibilityHiddenBtn.LostFocus -= AccessibilityHiddenBtn_LostFocus; + accessibilityHiddenBtn = null; + + SetNativeControl(null); + } + + if (e.NewElement != null) + { + accessibilityHiddenBtn = new Windows.UI.Xaml.Controls.Button(); + accessibilityHiddenBtn.IsTabStop = e.NewElement.IsTabStop; + accessibilityHiddenBtn.IsHitTestVisible = false; + accessibilityHiddenBtn.IsEnabled = e.NewElement.IsEnabled; + accessibilityHiddenBtn.Visibility = e.NewElement.IsTabStop && e.NewElement.IsEnabled && e.NewElement.IsVisible ? Visibility.Visible : Visibility.Collapsed; + accessibilityHiddenBtn.UseSystemFocusVisuals = false; + accessibilityHiddenBtn.Click += AccessibilityHiddenBtn_Click; + accessibilityHiddenBtn.GotFocus += AccessibilityHiddenBtn_GotFocus; + accessibilityHiddenBtn.LostFocus += AccessibilityHiddenBtn_LostFocus; + Canvas.SetZIndex(accessibilityHiddenBtn, -1); + + SetNativeControl(accessibilityHiddenBtn); + } + } + + protected override void Dispose(bool disposing) + { + if (disposing && Control != null) + { + accessibilityHiddenBtn.Click -= AccessibilityHiddenBtn_Click; + accessibilityHiddenBtn.GotFocus -= AccessibilityHiddenBtn_GotFocus; + accessibilityHiddenBtn.LostFocus -= AccessibilityHiddenBtn_LostFocus; + accessibilityHiddenBtn = null; + + SetNativeControl(null); + } + base.Dispose(disposing); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + switch (e.PropertyName) + { + case nameof(Element.IsEnabled): + case nameof(Element.IsTabStop): + case nameof(Element.IsVisible): + accessibilityHiddenBtn.Visibility = Element.IsTabStop && Element.IsEnabled && Element.IsVisible ? Visibility.Visible : Visibility.Collapsed; + break; + } + } + + private void AccessibilityHiddenBtn_GotFocus(object sender, RoutedEventArgs e) + { + } + + private void AccessibilityHiddenBtn_LostFocus(object sender, RoutedEventArgs e) + { + } + + private void AccessibilityHiddenBtn_Click(object sender, RoutedEventArgs e) + { + } + } +} \ No newline at end of file diff --git a/A11YTools/A11YTools.UWP/UWPA11yService.cs b/A11YTools/A11YTools.UWP/UWPA11yService.cs new file mode 100644 index 0000000..27e88b0 --- /dev/null +++ b/A11YTools/A11YTools.UWP/UWPA11yService.cs @@ -0,0 +1,52 @@ +using A11YTools.UWP; +using A11YTools.Views; +using System; +using System.Diagnostics; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Input; +using Xamarin.Forms; +using Xamarin.Forms.Platform.UWP; + +[assembly: Dependency(typeof(UWPA11yService))] +namespace A11YTools.UWP +{ + public class UWPA11yService : IA11yService + { + public void SetAnnouncement(string text) + { + throw new NotImplementedException(); + } + + public void SetControlType(VisualElement element, ControlType controlType) + { + throw new NotImplementedException(); + } + + public async void SetFocus(VisualElement element) + { + var containerElement = Platform.GetRenderer(element).ContainerElement; + + FrameworkElement view = null; + if (containerElement is AccessibleFocusBlockRenderer) + { + view = ((Xamarin.Forms.Platform.UWP.VisualElementRenderer)containerElement).Control; + } + if (containerElement is ButtonRenderer) + { + view = ((VisualElementRenderer)containerElement).Control; + } + + if (view == null) + throw new NotImplementedException(); + + var result = await FocusManager.TryFocusAsync(view, FocusState.Programmatic); + + Debug.WriteLine($"Set focus result {result.Succeeded}"); + } + + public void SetIsClickable(VisualElement element, bool isClickable, Action clickActionThatOnlyRunsOnAndroid) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/A11YTools/A11YTools/Views/AccessibleFocusBlock.cs b/A11YTools/A11YTools/Views/AccessibleFocusBlock.cs new file mode 100644 index 0000000..f9cd448 --- /dev/null +++ b/A11YTools/A11YTools/Views/AccessibleFocusBlock.cs @@ -0,0 +1,8 @@ +using Xamarin.Forms; + +namespace A11YTools.Views +{ + public class AccessibleFocusBlock : ContentView + { + } +} \ No newline at end of file diff --git a/A11YTools/A11YTools/Views/SetFocus.xaml b/A11YTools/A11YTools/Views/SetFocus.xaml index 55044e5..aea26c0 100644 --- a/A11YTools/A11YTools/Views/SetFocus.xaml +++ b/A11YTools/A11YTools/Views/SetFocus.xaml @@ -1,15 +1,45 @@  + x:Class="A11YTools.Views.SetFocus" + xmlns:local="clr-namespace:A11YTools.Views"> + - -