首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Treeview中包装TreeviewItem的TreeviewItem内容

在Treeview中包装TreeviewItem的TreeviewItem内容
EN

Stack Overflow用户
提问于 2017-06-20 07:54:24
回答 2查看 818关注 0票数 2

我试图在没有水平滚动条的情况下将项目内容包装在Treeview上,但仍未找到最佳解决方案。

下面是我正在使用的示例代码片段

代码语言:javascript
复制
   <TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <TreeViewItem IsExpanded="True">
            <TreeViewItem.Header>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}"/>                            
                    </Grid.ColumnDefinitions>
                    <TextBlock TextWrapping="Wrap" Text="Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here " />
                </Grid>
            </TreeViewItem.Header>
            <TreeViewItem>
                <TreeViewItem.Header>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}"/>                                
                        </Grid.ColumnDefinitions>
                        <TextBlock TextWrapping="Wrap" Text="Level 2.1 Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here " Foreground="Blue" />
                    </Grid>
                </TreeViewItem.Header>
            </TreeViewItem>               
        </TreeViewItem>
    </TreeView>

输出是

您可以看到内容超过视图。我知道这是因为我们正在设置Treeview宽度,而TreeviewItem有一些缩进,但是如何才能得到TreeviewItem的最佳width

已经尝试了以下链接,没有任何运气。

EN

回答 2

Stack Overflow用户

发布于 2017-06-20 09:30:59

每个TreeViewItem的最小缩进约为19个DIP --这是默认ControlTemplate中的一个硬编码值--因此您可以为每个级别增加这个值+一些偏移量:

代码语言:javascript
复制
<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <TreeViewItem IsExpanded="True">
        <TreeViewItem.Header>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}"/>
                </Grid.ColumnDefinitions>
                <TextBlock TextWrapping="Wrap" Text="Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here "
                                   Margin="0 0 25 0"/>
            </Grid>
        </TreeViewItem.Header>
        <TreeViewItem>
            <TreeViewItem.Header>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock TextWrapping="Wrap" Text="Level 2.1 Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here Level 1 (Blue) Some long text over here " Foreground="Blue"
                                       Margin="0 0 50 0"/>
                </Grid>
            </TreeViewItem.Header>
        </TreeViewItem>
    </TreeViewItem>
</TreeView>

如果您希望能够动态地这样做,可以在Loaded中处理TextBlockHierarchicalDataTemplate事件,并根据TreeViewItem容器的级别计算Margin。就像这样:

代码语言:javascript
复制
<TreeView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:YourType}" ItemsSource="{Binding Children}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}"/>
                </Grid.ColumnDefinitions>
                <TextBlock TextWrapping="Wrap" Text="{Binding Header}" Foreground="Blue" 
                           Loaded="TextBlock_Loaded" />
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>
代码语言:javascript
复制
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = sender as TextBlock;
    TreeViewItem tvi = FindParent<TreeViewItem>(textBlock);
    ItemsControl parent = ItemsControl.ItemsControlFromItemContainer(tvi);
    int index = 1;
    while (parent != null && parent.GetType() == typeof(TreeViewItem))
    {
        index++;
        parent = ItemsControl.ItemsControlFromItemContainer(parent);
    }

    textBlock.Margin = new Thickness(0, 0, 25 * index, 0);
}
票数 2
EN

Stack Overflow用户

发布于 2017-06-20 08:24:06

可以尝试设置TreeviewItem的宽度,获取拥有treeview或treeView本身的控件的实际宽度

在xaml中:

代码语言:javascript
复制
 Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeView //or x:Type ControlThatOwnTreeView}}, Path=ActualWidth
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44647072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档