2012-01-19 27 views
2

這一次,我的問題就像聽起來一樣簡單......你如何讓文字在WPF TreeViewItem中包裝?如何在WPF TreeViewItem中進行文本換行?

我有一個簡單的HierarchicalDataTemplate只有一個TextBlock在裏面。

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" /> 

該文字不換行。

我試過TextBlockWidth結合TreeViewActualWidth,但儘管這使文本套,TreeViewItemWidth不適合在TreeView因爲TreeViewPadding。綁定到TreeViewItemActualWidth具有(不出所料)同樣的效果。另一個缺點是,即使文字很少的項目在TreeView範圍之外。

<TextBlock Text="{Binding Value}" TextWrapping="Wrap" Width="{Binding ActualWidth, 
ElementName=TreeView}" /> 

當然必須有一個更好的辦法,像不知何故通知TreeView的界限的TreeViewItem ......我不能相信它不會自動知道。但我該怎麼做?

UPDATE >>>

由於HB的答案,我設法將Grid.ColumnSpan更改爲2對,他在ControlTemplate提到的BdBorder並設置寬度,使文本現在包裝精美。問題是我在其他TreeView s中使用此ControlTemplate其他TreeViewItem s,我不想要全寬項目。

我想出的解決方案很簡單。我已在TreeViewItem.Tag值綁定到Grid.ColumnSpan財產在ControlTemplate像這樣:

<Border Grid.ColumnSpan="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" 
Name="Bd" Grid.Column="1" ... /> 

這使我改變Grid.ColumnSpan,因此,全寬或由TreeViewItem.Tag值設置爲任意2 TreeViewItem普通寬度行爲或1。

+0

你可以張貼一些XAML? – 2012-01-19 23:38:18

回答

7

如果你看看TreeViewItemsthe default template你會看到這樣的網格:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="19" 
          Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <!-- ... --> 

正如你所看到的第三列佔據所有可用空間,而其餘的都在Auto,頭被放置在邊框內的第二列:

<Border Name="Bd" 
     Grid.Column="1" 
     ... 

這意味着該列將變得與標題一樣大,對其沒有限制。因此,標題只比TreeView本身更大。

如果您將Grid.ColumnSpan="2"添加到此邊框,它也將佔用第三列,並受到剩餘空間的限制,因此文本將被包裹;但是這將會擴展頭部的整個寬度,選擇它時可能看起來有點奇怪。

當然你還需要禁用水平滾動:

<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ... 

A screenshot

+0

我一直希望有一個簡單的財產,但是這個伎倆,非常感謝。 +1 – Sheridan

+0

@Sheridan:很高興幫助:)如果某些東西在默認模板中被硬編碼,它總是很糟糕...... –

相關問題