2010-01-18 31 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