В целом это работает, однако у меня возникла проблема: при новом элемент добавляется в ListBox или, скорее, добавляется в ObservableCollection, который привязан к ListBox, программа чтения с экрана не объявляет о новом добавленном элементе.
Это довольно серьезная проблема для наших слабовидящих пользователей, поскольку элементы, динамически добавляемые в список, чрезвычайно важны и требуют внимания. С точки зрения зрячих пользователей, они могут мгновенно увидеть вновь добавленный элемент, тогда как пользователь с ослабленным зрением не получает уведомления от программы чтения с экрана.
Мне удалось включить уведомление от программы чтения с экрана. небольшое тестовое приложение, добавив AutomationProperties.LiveSetting в Listbox в XAML, получив AutomationPeer для ListBox и вызвав AutomationEvents.LiveRegionChanged при товар добавлен:
Код: Выделить всё
// Do some processing which adds a new item, then retrieve the AutomationPeer to raise the event
var peer = UIElementAutomationPeer.FromElement(MyListBox);
if (peer != null)
{
peer.RaiseAutomationEvent(AutomationEvents.LiveRegionChanged);
}
Это легко достичь в небольшом тестовом приложении, используя код. Я пытаюсь понять и надеюсь, что кто-нибудь укажет мне правильное направление: как добиться этого с помощью MVVM.
Используя MVVM, у меня есть ObservableCollection в модели представления. Итак, когда элемент добавляется в ObservableCollection, как я могу получить AutomationPeer для ListBox и вызвать событие автоматизации в моей модели представления?
Возможно, я пытаюсь сделать это неправильно, я новичок как в WPF, так и в MVVM.
Вот мой пример:
Код: Выделить всё
XAML
Код: Выделить всё
Код: Выделить всё
Code Behind
Код: Выделить всё
using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WpfAppAccessibilityTest
{
public class MyViewModel
{
Dispatcher dispatcher;
public MyViewModel()
{
dispatcher = Dispatcher.CurrentDispatcher;
// Simulate handling some event that occurs in the future
Task.Delay(5000).ContinueWith(_ =>
{
dispatcher.Invoke(() =>
ListOfStuff.Add("Item2")
// How do I raise an AutomationPeer event here so screen reader will anounce the newly added item?
);
});
}
public ObservableCollection ListOfStuff { get; } = new ObservableCollection() { "Item1" };
}
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MyViewModel();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... t-box-item