2010-01-18 34 views
0

我正在使用WPF来显示复杂数据(想想报告)。我现在需要对它进行全文搜索。我们目前通过在视觉树上寻找文本块来做到这一点。看来这需要在UI线程上完成,是吗?这里的问题在于,在整个用户界面阻止期间发现下一场比赛可能需要相当长的一段时间。在工作线程中走VisualTree进行全文搜索

有没有办法规避这个问题?我可以尝试使用UI自动化,但是一旦找到匹配项,我该如何突出显示它?使用UI自动化我没有得到对UI元素的实际对象实例的引用,因此我无法在其上添加装饰器。

WPF中的全文搜索通常如何实现? XPS浏览器如何做到这一点?

回答

1

您在查询中必须在UI线程上完成可视化树,并且UI自动化只能以与坐在计算机上的人类似的方式与应用程序交互,无法访问实际的控件(就像这个人没有)。

解决这个问题的正确方法是将用户界面放在一边,并在数据源(MVVM中的模型)中搜索文本。毕竟,你真的想搜索你的用户界面显示的信息,而不是用户界面本身。

+0

我需要突出显示找到的文本。使用MVVM方法,我将如何选择/突出显示ViewModel中找到的文本部分?所有不同的文本部分和ViewModel实例之间必须有某种连接。同样使用MVVM,VIewModel需要知道View中使用的每个单独的文本。 ''这里的标签内容只被视图所知,但它也需要通过文本搜索找到。 – bitbonk

+0

要使用MVVM来做到这一点,您必须确保您要搜索的所有内容都在您的模型中表现出来,并且您必须想出一个机制将模型与UI相关联以突出显示(例如,验证开始字符和长度的亮点)。如果您完全相信它是您需要搜索的UI,那么您将无法使用UI线程查询控件的内容并进行高亮显示。 UI Automation不会允许您修改用户无法更改的任何内容。 – GraemeF

+0

UI自动化不会给出找到的控件的边界框吗?我可能可以在屏幕坐标中添加一个装饰器......(?) – bitbonk

0

wpf自动marshals inotifypropertychanged到ui线程上,所以你可以在另一个线程上进行处理并设置属性。你如何做到这一点取决于你的代码结构。例如你使用mvvm吗?如果没有,你可能会使用调度程序调用你的用户界面上的任何方法。如果你回复一些关于你的代码结构的信息,我应该能够提供一个更加明确的答案。如果你没有使用mvvm,你仍然可以避免显式编组,如果你使用wpf数据绑定和你可以处理的非ui数据源。

+0

我不使用MVVM,我每次读取模型数据时都会根据某些模型数据在c#中生成UI。当鼠标点击时,我开始搜索VisualTree for TextBoxes。访问可视化树和依赖项属性不能在UI线程之外的另一个线程中完成。 – bitbonk