簡體   English   中英

如何在TreeviewItem中制作文字換行?

[英]How to make Text Wrap in TreeviewItem?

編輯下面從弗朗切斯科B.給出的解決方案正在工作。 我想知道是否還有XAML解決方案。

我想使TreeViewItem內的TextBlock中的Text換行。 我試圖從溶液中這個鏈接。 它將使Header文本換行,而不是展開的TextBlock。

這是帶有父網格的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做些事情。 但是什么都行不通!

請提出解決方案!

謝謝。

我能想到的最快的事情主要是使用后台代碼。 它只需要在外部GridTreeView添加一個名稱,即可從中刪除樣式聲明:

<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;
    }
}

然后,使用此解決方案 ,當第一次顯示Window時,我向該方法添加了一個調用以調整TreeView大小:

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)。

要查看XAML解決方案,您可以嘗試從treeviewitem模板中刪除ContentPresenter,然后將其更改為具有所需屬性(例如MaxWidth和TextWrapping)的TextBlock,僅此而已。 如果您在模板Text="{TemplateBinding Header}"設置TextBlock,則一切仍然有效。 現在,您不需要在每個treeviewitem內放置一個文本塊-模板就在其中)然后您可以根據需要添加treeviewitems:使用ItemsSource(在這種情況下,您可能還應該指定DataTemplate),或者就像

<TreeView> <TreeViewItem Header="first"/><TreeViewItem Header="second"/>...</TreeView> 

還是從后台代碼開始,都沒關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM