C# 制作TreeViewItem包装的一部分

C# 制作TreeViewItem包装的一部分,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我有一个TreeViewItem,其中包含多个部分——一个图标、一个标题和一段数据。我试着让最后一部分在不把所有东西都包起来的情况下包起来,我没有运气。以下是问题的说明: 我尝试了一些在堆栈溢出上发现的方法,但没有成功。我发现有三条建议: 将项目放入一个网格中,该网格中的列绑定到树视图的实际宽度。这是在下面的XAML中实现的,但似乎没有帮助 使用ScrollViewer.HorizontalScrollBarVisibility=“Disabled”在TreeView上禁用水平滚动,这也是我在

我有一个
TreeViewItem
,其中包含多个部分——一个图标、一个标题和一段数据。我试着让最后一部分在不把所有东西都包起来的情况下包起来,我没有运气。以下是问题的说明:

我尝试了一些在堆栈溢出上发现的方法,但没有成功。我发现有三条建议:

  • 将项目放入一个网格中,该网格中的列绑定到
    树视图的实际宽度。这是在下面的XAML中实现的,但似乎没有帮助

  • 使用
    ScrollViewer.HorizontalScrollBarVisibility=“Disabled”
    TreeView上禁用水平滚动,这也是我在下面的XAML中实现的

  • 将我需要的东西包装在
    包装袋中
    。我试过这个,但效果很差。当我将整个
    TreeViewItem
    打包在一个文件中时,我得到了难以控制的打包(整个项目打包,所以所有部分都打包了,看起来很糟糕)。当我将所需的
    TextBlock
    打包成一个时,我根本没有得到任何结果。所以我把它拿了出来

  • 这是我为
    TreeViewItem
    准备的模板:

    <DataTemplate x:Key="BasicPropertyTemplate" DataType="{x:Type json:JProperty}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=ActualWidth}" />
            </Grid.ColumnDefinitions>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16" />
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Border
                    Width="12"
                    Height="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Background="{Binding Converter={StaticResource TypeToColorConverter}, ConverterParameter='Interior'}"
                    BorderBrush="{Binding Converter={StaticResource TypeToColorConverter}}"
                    BorderThickness="1" />
                <TextBlock Grid.Column="2" Text="{Binding Name, Mode=OneWay}" />
                <TextBlock Grid.Column="4" Text=": " />
                <TextBlock
                    Grid.Column="6"
                    Text="{Binding Value, Converter={StaticResource StringFormatConverter}, Mode=OneWay}"
                    TextWrapping="Wrap" />
            </Grid>
        </Grid>
    </DataTemplate>
    

    我觉得我做错了什么,但我不知道是什么。有没有一种方法可以做到这一点,而不只是将
    TextBlock
    宽度锁定为任意值,如200?

    我的调查表明,TextBlock Wrap不能与
    一起使用。因此,我将DataTemplate中最后一个
    更改为

    不幸的是,TreeView项目(TreeView项目的默认容器)的模板中有
    ,并将我们的项目放在那里。我试着用
    制作一个自定义模板,虽然成功了,但代码确实很长。所以我决定通过绑定网格宽度来补偿这种效果:

    <DataTemplate x:Key="BasicPropertyTemplate" DataType="{x:Type json:JProperty}">
        <Grid Width="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=ActualWidth}" >
            <Grid Margin="0,0,20,0"> <!--right margin to compensate excessive width-->
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16" />
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="3" />
                    <ColumnDefinition Width="*"/> <!--was Auto-->
                </Grid.ColumnDefinitions>
            <Border
                Width="12"
                Height="12"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Background="{Binding Converter={StaticResource TypeToColorConverter}, ConverterParameter='Interior'}"
                BorderBrush="{Binding Converter={StaticResource TypeToColorConverter}}"
                BorderThickness="1" />
            <TextBlock Grid.Column="2" Text="{Binding Name, Mode=OneWay}" />
            <TextBlock Grid.Column="4" Text=": " />
            <TextBlock
                Grid.Column="6"
                Text="{Binding Value, Converter={StaticResource StringFormatConverter}, Mode=OneWay}"
                TextWrapping="Wrap" />
            </Grid>
        </Grid>
    </DataTemplate>
    
    
    

    ScrollViewer.HorizontalScrollBarVisibility=“Disabled”
    是一个重要元素,应该进行设置。

    尝试使用DockPanel更改DataTemplate中的网格:

    <DataTemplate>
        <DockPanel>
            <Border Width="12"
                    Height="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Background="{Binding Converter={StaticResource TypeToColorConverter}, ConverterParameter='Interior'}"
                    BorderBrush="{Binding Converter={StaticResource TypeToColorConverter}}"
                    BorderThickness="1" />
            <TextBlock Text="{Binding Name, Mode=OneWay}" />
            <TextBlock Text=": " />
            <TextBlock Text="{Binding Value, Converter={StaticResource StringFormatConverter}, Mode=OneWay}"
                    TextWrapping="Wrap" />
        </DockPanel>
    </DataTemplate>
    
    
    

    您是否使用任何自定义的TreeView或TreeView项目控件模板?实际上,我已经完成了包装工作,但您必须稍微更改默认的树模板,而且实际上非常简单,而且不需要任何硬编码宽度。好奇的TreeViewItem模板:另一个来自works的TextBlock wrap示例,因为在
    Border x:Name=“Bd”
    上有
    Grid.ColumnSpan=“2”
    ,所以它再次消除了有效的
    !我不得不根据自己的情况对它进行一些调整(边距必须是
    0 0 80 0
    ),因为文本换行有点太晚(导致结尾的一些单词在换行之前被切掉),但通常这样做了。非常感谢。不幸的是,这对我不起作用。我试过了(并且完全复制了你的模板),但仍然没有成功。谢谢你!
    <DataTemplate>
        <DockPanel>
            <Border Width="12"
                    Height="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Background="{Binding Converter={StaticResource TypeToColorConverter}, ConverterParameter='Interior'}"
                    BorderBrush="{Binding Converter={StaticResource TypeToColorConverter}}"
                    BorderThickness="1" />
            <TextBlock Text="{Binding Name, Mode=OneWay}" />
            <TextBlock Text=": " />
            <TextBlock Text="{Binding Value, Converter={StaticResource StringFormatConverter}, Mode=OneWay}"
                    TextWrapping="Wrap" />
        </DockPanel>
    </DataTemplate>