Контекст (если вы не знакомы с программами чтения с экрана). Программы чтения с экрана доступны в iOS (VoiceOver) и Android (TalkBack) для поддержки доступности для людей с серьезными нарушениями зрения. В двух словах, когда программа чтения с экрана активирована и пользователь касается элементов пользовательского интерфейса, он получает «фокус доступности» (событие «при нажатии» не запускается), а затем, когда пользователь дважды нажимает, «при нажатии» "Событие запущено. В собственном коде iOS и Android можно переопределить методы, чтобы указать, что делать, когда элемент пользовательского интерфейса получает или теряет фокус доступности. Методы называются accessibilityElementDidBecomeFocused () (для iOS в быстром) и onPopulateAccessibilityEvent (для Android в Java). Почти то же самое для C# в Xamarin ( View.OnPopulateAccessibilityEvent для Android и UIResponder.AccessibilityElementDidBecomeFocused для iOS)
Проблема 1. Мне не удалось найти метод в формах Xamarin для управления событиями фокуса доступности (когда элемент пользовательского интерфейса получает или теряет доступность фокус). Знаете ли вы, существуют ли такие методы в формах Xamarin? Если они не существуют, мы считаем, что они очень важны для Он разрабатывает доступные приложения, поэтому мы хотели бы предложить добавить их. Знаете ли вы, какова процедура, чтобы предложить команде Xamarin реализовать новую функциональность?
Проблема 2. Чтобы преодолеть проблему 1, я пытаюсь создать пользовательский рендерер, который использует собственные кнопки. Представленный пользовательский файл, кажется, правильно инициализирован (правильное сообщение зарегистрировано) и показан на экране. Однако переопределенные методы не вызываются. Код показан ниже и доступен git Репозиторий . Я делаю что-то неправильно?
MainPage.Xaml.cs (в формах, CustomViewAccessibility):
using System;
using System.ComponentModel;
using Xamarin.Forms;
namespace CustomViewAccessibility
{
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
ICustomViewRenderer mybutton = new ICustomViewRenderer();
AutomationProperties.SetIsInAccessibleTree(mybutton, true);
stacklayout.Children.Add(mybutton);
}
}
}
ICustomViewRenderer.cs (в формах, CustomViewAccessibility):
using System;
using Xamarin.Forms;
namespace CustomViewAccessibility
{
public class ICustomViewRenderer: Button
{
public ICustomViewRenderer()
{
}
}
}
AndroidCustomView.cs ( в Android, CustomViewAccessibility. Android):
using System;
using Android.Content;
using Android.Views.Accessibility;
using CustomViewAccessibility;
using CustomViewAccessibility.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(ICustomViewRenderer), typeof(AndroidCustomView))]
namespace CustomViewAccessibility.Droid
{
public class AndroidCustomView: ButtonRenderer
{
public AndroidCustomView(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if(Control == null)
{
return;
}
Console.WriteLine("PIPPO created from Android");
Control.SetBackgroundColor(Android.Graphics.Color.Orange);
}
public override void OnPopulateAccessibilityEvent(AccessibilityEvent e)
{
base.OnPopulateAccessibilityEvent(e);
if (e.EventType == EventTypes.ViewAccessibilityFocused)
{
Console.WriteLine("PIPPO I am in focus");
}
}
}
}
IOSCustomView.cs (в iOS, CustomViewAccessibility. iOS):
using System;
using CustomViewAccessibility;
using CustomViewAccessibility.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(ICustomViewRenderer), typeof(IOSCustomView))]
namespace CustomViewAccessibility.iOS
{
public class IOSCustomView: ButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if(Control == null)
{
return;
}
Console.WriteLine("PIPPO created from IOS");
Control.BackgroundColor = UIColor.Red;
}
public override void AccessibilityElementDidBecomeFocused()
{
base.AccessibilityElementDidBecomeFocused();
Console.WriteLine("PIPPO I am in focus");
}
}
}