Пройдите VisualTree в рабочем потоке для полнотекстового поиска - PullRequest
0 голосов
/ 18 января 2010

Я использую WPF для отображения сложных данных (например, отчеты). Теперь мне нужен полнотекстовый поиск. В настоящее время мы делаем это, обходя визуальное дерево в поисках текстовых блоков. Кажется, что это должно быть сделано в потоке пользовательского интерфейса, не так ли? Проблема здесь в том, что может пройти довольно много времени, пока не будет найдено следующее совпадение во время целых блоков пользовательского интерфейса.

Есть ли способ обойти эту проблему? Я мог бы попытаться использовать UI Automation, но как только я нашел соответствие, как я могу выделить его? При использовании автоматизации пользовательского интерфейса я не получаю ссылки на фактический экземпляр объекта элемента пользовательского интерфейса, поэтому я не могу поместить на него рекламный элемент.

Как обычно осуществляется полнотекстовый поиск в WPF? Как программа просмотра XPS это делает?

Ответы [ 2 ]

1 голос
/ 18 января 2010

Вы правы в том, что запросы к визуальному дереву должны выполняться в потоке пользовательского интерфейса, а также в том, что автоматизация пользовательского интерфейса может взаимодействовать с приложением только так, как человек, сидящий за компьютером, поэтому иметь доступ к фактическим элементам управления (так же, как человек не имеет).

Правильный способ подойти к этому - отложить UI и искать текст в вашем источнике данных (модель в MVVM). В конце концов, вы действительно хотите искать информацию, отображаемую вашим пользовательским интерфейсом, а не сам пользовательский интерфейс.

0 голосов
/ 18 января 2010

wpf автоматически выполняет маршалирование inotifypropertypted в потоке пользовательского интерфейса, чтобы вы могли выполнять обработку в другом потоке и устанавливать свойства. как вы это сделаете, зависит от структуры вашего кода. например вы используете mvvm? в противном случае вы можете использовать диспетчер для вызова любых методов в вашем пользовательском интерфейсе. если вы ответите немного больше информации о вашей структуре кода, я смогу дать более понятный ответ. если вы не используете mvvm, вы все равно можете избежать явного маршалинга, если вы используете привязку данных wpf с источником данных, отличным от пользовательского интерфейса, с которым вы можете выполнять свою обработку.

...