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>