WPF, MVVM, Как заставить программу чтения с экрана объявлять о новом добавленном элементе спискаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 WPF, MVVM, Как заставить программу чтения с экрана объявлять о новом добавленном элементе списка

Сообщение Anonymous »

Я модифицирую существующее приложение WPF, MVVM (с использованием .NET 8), чтобы оно могло поддерживать программы чтения с экрана. Для удобства и быстрого тестирования я использую экранный диктор Windows 11, но буду также тестировать с помощью JAWS.
В целом это работает, однако у меня возникла проблема: при новом элемент добавляется в 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.
Вот мой пример:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»