Как сделать перенос текста в WPF TreeViewItem? - PullRequest
2 голосов
/ 20 января 2012

На этот раз мой вопрос настолько прост, насколько это звучит ... как получить текст для переноса в WPF TreeViewItem?

У меня есть простой HierarchicalDataTemplate с одним TextBlock.

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

Текст не переносится.

Я пытался связать Width TextBlock с ActualWidth TreeView, но, хотя это делает перенос текста, Width TreeViewItem не помещается в TreeView потому что TreeView имеет Padding. Привязка к ActualWidth из TreeViewItem имеет (неудивительно) тот же эффект. Другим недостатком этого является то, что даже элементы с небольшим текстом простираются за пределы TreeView.

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

Конечно, должен быть лучший способ, например, как-то информировать TreeViewItem о границах TreeView ... Я не могу поверить, что он не знает автоматически. Но как я могу это сделать?

ОБНОВЛЕНИЕ >>>

Благодаря ответу Х.Б. мне удалось изменить Grid.ColumnSpan на 2 на Bd Border, который он упомянул в ControlTemplate, и он установил ширину, чтобы текст теперь хорошо переносился. Проблема в том, что я использую это ControlTemplate для других TreeViewItem s в других TreeView s, где я не хочу элементы полной ширины.

Решение, которое я нашел, простое. Я связал значение TreeViewItem.Tag со свойством Grid.ColumnSpan в ControlTemplate следующим образом:

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

Это позволяет мне изменить Grid.ColumnSpan и, следовательно, поведение полной или обычной ширины TreeViewItem, установив для значения TreeViewItem.Tag либо 2, либо 1 соответственно.

1 Ответ

8 голосов
/ 20 января 2012

Если вы посмотрите на шаблон по умолчанию из TreeViewItems, вы увидите сетку, подобную этой:

<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

...