Автоматизация пользовательского интерфейса WPF - не поддерживает строки? (или как я могу выбрать и отменить выбор всей строки) - PullRequest
2 голосов
/ 22 января 2010

Примечание: это больше не проблема, встроенная DataGrid .NET 4 решает эту проблему


У меня есть приложение WPF, которое использует DataGrid; Я использую API автоматизации WPF для написания некоторых автоматических тестов. DataGrid является WPFToolkit, я использую .NET 3.5SP1 с VS2008, и в сетке данных включена функция множественного выбора.

Я нахожусь в том, что из моего теста можно найти сетку данных, и я могу найти отдельные ячейки в сетке, используя метод GridPattern.GetItem, и выбрать их, установив SelectionItemPattern.Select. Метод

Код выглядит примерно так:

AutomationElement mainGrid = // find the grid in the window
var columnCount = (int)mainGrid.GetCurrentPropertyValue(GridPattern.ColumnCountProperty);
var mainGridPattern = (GridPattern)mainGrid.GetCurrentPattern(GridPattern.Pattern);

var rowToSelect = 2;

// select just the first cell
var item = mainGridPattern.GetItem(rowToSelect, 0);
var itemPattern = (SelectionItemPattern)item.GetCurrentPattern(SelectionItemPattern.Pattern);
itemPattern.Select();

Кажется, это работает, но он выбирает только первую отдельную ячейку, а не всю строку таблицы (которая имеет 10 столбцов), но я не могу понять, как отменить выбор элемента. Единственное, что я могу найти, похоже, что это может сработать, это позвонить SelectionItemPattern.AddToSelection() на itemPattern или соответствующем RemoveFromSelection, но когда я делаю любой из них, возникает следующее исключение:

=> Cannot change cell selection when the SelectionUnit is FullRow.
   at MS.Internal.Automation.ElementUtil.Invoke(AutomationPeer peer, DispatcherOperationCallback work, Object arg)
   at MS.Internal.Automation.SelectionItemProviderWrapper.AddToSelection()

Основная корневая проблема заключается в том, что (насколько я вижу) в API автоматизации пользовательского интерфейса WPF отсутствует концепция строки сетки, только ячейки. Это кажется несколько проблематичным - это правильно?

Sidenote: Ранее я использовал платформу автоматизации пользовательского интерфейса White - она ​​не использует автоматизацию пользовательского интерфейса для выбора строк сетки, вместо этого она перемещает мышь в местоположение строки и щелкает по ней - что вызвало случайные сбои наших тестов - вот почему они используют мышь, чтобы сделать выбор?

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Теперь это, кажется, исправлено в .NET 4. Строки теперь отображаются как реальные объекты, поддерживающие SelectionItemPattern, так что теперь вы можете выбрать / отменить выбор строки. Hooray

0 голосов
/ 12 марта 2010

Если вы используете UISpy для просмотра структуры вашей DataGrid с точки зрения UIAutomation, вы заметите, что элемент DataGrid содержит RowsPresenter, а RowsPresenter содержит несколько DataGridRows, каждый из которых содержит DataGridCell.

Я подозреваю, что происходит то, что var item = mainGridPattern.GetItem(rowToSelect, 0); возвращает элемент, представляющий ячейку, тогда как вам нужен элемент, представляющий всю строку.

Вы можете получить это, позвонив item.CachedParent - затем Select(), что.

...