2012-11-20 60 views
0

我目前正在WPF TreeView顯示。此樹視圖的內容是從普通數據綁定:做業主繪製WPF項目生成的數據綁定

<TreeView HorizontalAlignment="Stretch" 
     x:Name="LogMonitor" 
     VerticalAlignment="Stretch" 
     ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate 
       DataType="{x:Type Log:SystemLog}" 
       ItemsSource="{Binding Path=Lines}"> 
       <TextBlock Text="{Binding Header}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

TreeView的是通過關鍵字過濾,但我也想有關鍵字高亮所有留在樹視圖中的樹型視圖。

舉例來說,如果沒有與頭一個TreeViewItem 「這是一個蘋果」和用戶輸入「蘋果」作爲過濾關鍵字,它應該顯示一個樹型視圖的樣子:

Highlight

我嘗試了一些方法,但沒有太多的運氣。

  1. 使用內置的樣式:
    高亮顯示需要字符串匹配以及將所述顏色塊匹配的子字符串下方。似乎沒有內置的樣式模板可以用這種方式來裝飾。

  2. 繪製到畫布視圖模型對象,並綁定畫布的樹型視圖:
    它的工作原理,只有當沒有選擇樹型視圖,一旦選擇,內置的繪圖調用不能找到一種方法來繪製在畫布「突出」風格,只留下一片空白區域。

  3. 創建樹型視圖的子類,覆蓋的OnRender功能,那麼替代的TreeView的ItemContainerGenerator返回樹型視圖的我的子類:
    不可能,TreeView控件的ItemContainerGenerator不可設置和非虛。

    我只能想到一個多選項:

  4. 放棄數據綁定,通過自己與overrided的OnRender功能推樹型視圖的子類爲TreeView控件的項目列表中。

它給了我在實驗中的積極結果。但是我對放棄數據綁定範例感到不舒服。所以我想問一下,有沒有其他方式來做數據綁定呈現所有者繪製。

謝謝。

+0

將'UpdateSourceTrigger = PropertyChanged'變成單向綁定是沒有意義的S: –

+1

我會使用Snoop來檢查可視圖層,看看是否有一個Adorner圖層可用於將紅色矩形添加到該圖層中在樹視圖上方,但在節點的文本下方。我不知道TreeView的裝飾層是否是解決方案 – Alan

+0

我發現Snoop是一個了不起的工具。謝謝。雖然我還沒有找到一個體面的方式去做我想做的事。 在方向我試着重寫TreeView的GetContainerForItemOverride並返回我想要的子類。然後在TreeViewItem子類中執行OnRender覆蓋。它以某種方式工作,bur有一些我幾乎無法擺脫的故障。 –

回答

0

創建一個用戶控件,將文本分解爲3個區域:高亮,高亮和高亮。你可以使用標準的綁定和樣式完成這一切。每個TreeViewItem都是這些控件之一。

+0

只是出於參數的緣故,如果關鍵字在同一文本中出現兩次,該怎麼辦? – Alan

+0

好點。使用此方法時,我們沒有這種情況。另一個想法是用適當的樣式填充TextBlocks的StackPanel。也許填寫一個屬性的變化。 –