Как сделать перенос текста в TreeviewItem? - PullRequest
0 голосов
/ 12 мая 2018

Редактировать : Решение, данное ниже от Франческо Б., работает. Мне было интересно, есть ли решение XAML также.

Я бы хотел сделать Text in TextBlock внутри TreeViewItem для переноса. Я пробовал решение по этой ссылке. Это сделает перенос текста заголовка, но не расширенный текстовый блок.

Вот мой TreeView с родительской сеткой:

<Grid Background="LightGray">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Grid Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <TreeViewItem Style="{DynamicResource TreeViewItemStyle1}">
                <TreeViewItem.Header>

                    <TextBlock Text="Header Header Header Header Header Header Header Header "
                               TextWrapping="Wrap" />

                </TreeViewItem.Header>
                <TextBlock Text="1very 2very 3very 4very 5long 6very 7very 8very 9very 10Long"
                           TextWrapping="Wrap"
                           Background="LightCyan" />

            </TreeViewItem>
        </TreeView>

    </Grid>

    <GridSplitter Grid.Column="1"
                  Width="10"
                  ResizeBehavior="PreviousAndNext" />
    <Grid Grid.Column="2"
          Background="LightPink" />
</Grid>

Вот часть измененного шаблона из TreeViewItemStyle1:

                            <Border x:Name="Bd"
                                BorderBrush="Red"
                                BorderThickness="1"
                                Background="{TemplateBinding Background}"
                                Grid.Column="1"
                                Grid.ColumnSpan="2"
                                Grid.Row="0"
                                Padding="{TemplateBinding Padding}"
                                SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="PART_Header"
                                              ContentSource="Header"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost"
                                        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                        TextBlock.FontSize="35"
                                        Grid.Column="1"
                                        Grid.ColumnSpan="2"
                                        Grid.Row="1">
                        </ItemsPresenter>

Я добавил Grid.ColumnSpan="2" к границе как другое решение, но это делает только заголовок для переноса. Я чувствую, что должен что-то делать с ItemsPresender. Но ничего не работает!

Пожалуйста, предложите решение!

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Чтобы увидеть решение XAML, вы можете просто попытаться удалить ContentPresenter из шаблона treeviewitem и изменить его на TextBlock с необходимыми свойствами, такими как MaxWidth & TextWrapping, и все.Если вы установите TextBlock в шаблоне Text="{TemplateBinding Header}", все будет работать.И теперь вам не нужно помещать текстовый блок внутри каждого элемента дерева - шаблон просто имеет его внутри). Затем вы добавляете элементы дерева как хотите: используя ItemsSource (в этом случае вам, вероятно, также следует указать DataTemplate) или просто как

* 1003.*

Или из обратного кода, это не имеет значения.

0 голосов
/ 12 мая 2018

Самая быстрая вещь, о которой я могу думать, в основном использует code-behind. Это просто требует добавления имени к внешнему Grid и TreeView, из которого я удалил объявление стиля:

<Grid  x:Name="MyGrid" Background="LightGray" >
...
<TreeView x:Name="MyTree" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Затем в коде позади я добавил метод для изменения размера как заголовка, так и элемента каждого TreeViewItem:

private void ResizeTree()
{
    var MaxWidth = Convert.ToDouble(MyGrid.ColumnDefinitions[0].ActualWidth);
    foreach (TreeViewItem item in MyTree.Items)
    {
        var Header = item.Header as TextBlock;
        var Body = item.Items[0] as TextBlock;
        Header.Width = MaxWidth - 30;
        Body.Width = MaxWidth - 60;
    }
}

Затем, используя это решение , я добавил вызов метода для изменения размера TreeView, когда Window отображается впервые:

private bool _shown = false;

public MainWindow()
{
    InitializeComponent();
}

protected override void OnContentRendered(EventArgs e)
{
    base.OnContentRendered(e);
    if (_shown)
    {
        return;
    }

    _shown = true;
    ResizeTree();
}

В последний раз я добавил событие, которое будет вызвано при перемещении GridSplitter:

<GridSplitter Grid.Column="1" DragCompleted="GridSplitter_DragCompleted"
              Width="10" ResizeBehavior="PreviousAndNext" />

который, конечно, должен вызывать метод ResizeTree:

private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
    ResizeTree();
}

Другие вещи, с которыми возможно иметь дело, - изменение размера окна или использование другого поля для заголовка и элемента (я выбираю 30 и 60).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...