我有几个关于TreeView的分层模板格式的问题。此图像将说明:
- 我想删除字体顶部和边框之间的多余空间。
- 我想把图标放在两行字中间
- 我想加一个千位逗号。我已经尝试过了,但是在绑定数据时添加逗号有问题。
下面是第三层的XAML代码:
<HierarchicalDataTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
ItemsSource="{Binding XPath=Unit}"
>
<Grid Height="42" Width="auto" >
<Grid Height="41" HorizontalAlignment="Left" Margin="0,0,0,0" Name="grid1" VerticalAlignment="Top" Width="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Image Source= "{Binding XPath=UnitIcon}" Grid.Column="1" Grid.RowSpan="2" VerticalAlignment="Center" HorizontalAlignment="Left" Stretch="None" OpacityMask="White"></Image>
<Label Content="{Binding XPath=UnitName}" Height="54" HorizontalAlignment="Left" Name="label4" VerticalAlignment="Top" FontFamily="Smythe" FontSize="18" Margin="0,0,0,0" Grid.RowSpan="3" Grid.Column="2" Grid.ColumnSpan="3"/>
<Label Content="Strength:" FontFamily="Amaltea WF" FontSize="12" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Center" Grid.Column="2" Grid.Row="2"/>
<TextBlock Text="{Binding XPath=UnitStrength, ConverterParameter=N0}" Margin="0,0,0,0" FontFamily="BauderieScriptSSK Bold" FontSize="18" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="3" Grid.Row="2"/>
</Grid>
<Line X1='0'
X2='200'
Y1='0'
Y2='0'
Stroke="Gray"
StrokeThickness='1' />
</Grid>
</HierarchicalDataTemplate>
1条答案
按热度按时间9o685dep1#
1.从“单元名称”标签上取下固定高度。你有网格单元,你不想要固定的高度。该间隙的一部分可能是字体的行高。在标签上临时设置
Background="LightSkyBlue"
,以查看标签本身实际占用的空间。1.图像上的
VerticalAlignment="Center"
看起来没有达到预期的效果,因为您在所有内容上设置了冲突的固定高度。您的grid1
固定为41个单位高,但其中的单位名称为54个单位高。布局引擎正在尽最大努力遵守您给它的矛盾命令。删除XAML中的每个固定高度。所有人,没有例外。让事情自己发展。如果你必须给一个控件施加一个固定的高度,考虑把它的内容放在一个
ViewBox
中,这样内容就可以动态地调整自己的大小,而不会溢出容器。或者不;这看起来很奇怪。但首先要让你的相对布局工作,然后开始工作,把它塞进任何有限的空间,你有它。当您在XAML布局方面遇到问题时,天真的冲动是添加一些东西。最糟糕的是,添加 random 的东西--“我不知道这个属性是什么意思,也不知道它的值是什么意思,但如果我在这个控件上添加它,也许它会修复另一个控件的问题!“最好的情况是,你添加的东西是无害的。
别这样*删除 * 的东西,而不是,然后建立备份。一次添加一件事,看看它会做什么。并且在没有阅读文档的情况下不添加任何内容。从Intellisense * 添加六个随机属性似乎 * 比在MSDN上查找一个属性花费更少的时间,但实际情况并非如此,因为第一种方法总是完全浪费时间。这就像闭上眼睛开车,试图通过你撞到的障碍物的感觉来控制方向。
1.您将正确的格式字符串赋给了错误的属性。试试这个:
除了哇哈哈哈哈,这不适用于
Binding.XPath
,所以我在胡说八道。这个也不一样我怀疑他们失败了,因为你给他们一个字符串,而不是一个整数,但这只是一个猜测。
但这个管用。
XAML.
YOUR_NAMESPACE_HERE
是定义IntToStringConverter
类的C#命名空间。这不一定是正确的它可以位于父标记或此XAML文件中的任何包含标记上,包括根标记(Window
或UserControl
或ResourceDictionary
)。把它放在这里会使这个例子更加独立。更新
对于TreeView:
但是,如果模板只在一个地方使用,这也可以工作:
另一个Upate
或者最后,如果你想把所有的数据模板放在一个文件中,你想创建一个资源字典:
DataTemplate.xaml
又一更新
所以我们看到的树有多个层次,每个层次有不同的模板。至少有两种方法可以做到这一点:如果我们有一个包含不同子类型的.NET类树,我们可以在资源字典中定义“隐式模板”。它们有一个
DataType
属性而不是x:Key
,结果(例如)带有DataType="{x:Type local:HQ}"
的模板将自动用于显示该类型的任何类示例。但是你有XML,所以这是行不通的。您可以做的是为每个
HierarchicalDataTemplate
提供其自己的ItemTemplate
。为了清楚起见,下面的示例省略了ItemsSource
和许多其他内容--它只说明了我们如何设置这些父/子模板关系。HQTemplate
将是树视图的ItemTemplate