我有一个ItemsControl,想要从我的CustomObject中显示一些字符串。
就像
String A
String B
String C
其中字符串A和B可以是多行长,但C不能。我在考虑Height="Auto"
和一个DockPanel。但是,字符串A的高度应该是必须的。还有String B。
这是我到目前为止所提出的:
<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Background="Black">
<ItemsControl Name="ItemsControl1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="#FF126eb1" BorderThickness="1.5" CornerRadius="8,8,8,8" Background="#FF074e84" Width="350" Height="Auto">
<DockPanel Width="350" Margin="0,10,0,0" Height="Auto" Background="Transparent">
<Canvas DockPanel.Dock="Top" Height="Auto" Width="350" Margin="0,10,0,0">
<TextBlock Text="{Binding Headline}" Canvas.Left="5" Canvas.Top="5" Foreground="White" FontSize="15" FontWeight="Bold" MaxWidth="340" TextWrapping="Wrap" Height="Auto"/>
</Canvas>
<Canvas DockPanel.Dock="Top" Height="Auto" Width="350" Margin="0,10,0,0">
<TextBlock Text="{Binding Description}" Canvas.Left="5" Canvas.Top="20" Foreground="White" FontSize="13" MaxWidth="340" TextWrapping="Wrap" Height="Auto" />
</Canvas>
<Canvas DockPanel.Dock="Top" Width="350" Height="40" Margin="0,10,0,0" Background="Transparent">
<TextBlock Text="{Binding DeadlineOn, StringFormat='Deadline: {0}'}" Canvas.Left="5" Canvas.Top="5" Foreground="White"/>
<!-- and other controls -->
</Canvas>
</DockPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
不幸的是,只有margin属性为字符串A和B创建高度。
如果每个项目的高度未知,我该怎么做?
答案 0 :(得分:2)
有很多布局元素,虽然这给你提供了很多选择,但在任何给定的情况下,很难确定哪个布局元素是正确的。
通常,Canvas
对其方便的固定定位功能很有用。它允许使用Canvas.Left
和Canvas.Top
附加属性将任何内容放置在任何位置。但是因为Canvas
的大小是固定的并且不依赖于它的子节点,所以很难用于可变大小的内容。 Canvas
的父级与Canvas
的子级大小“绝缘”,这在某些情况下实际上很有用。
相比之下,Grid
是迄今为止灵活的布局元素,可用于布局包含行和列的网格,有或没有跨越等。这就是为什么它是创建新{时的默认值{1}}或Window
。但与UserControl
不同,Canvas
的大小,未指定且未拉伸到可用空间时,是其所有子项大小的并集。
Grid
还具有以下属性:如果它有多个子节点且未放入行或列,则它们重叠彼此叠加,后面的子节点在Z顺序中更高。这就像Grid
但没有Canvas
和Canvas.Left
,我们如何才能精确控制孩子的位置?
让我们看一个例子。这是一个Canvas.Top
,其中两个矩形并排放置一个小空格,Canvas
做同样的事情:
Grid
在第一种情况下,我们必须指定<Grid>
<StackPanel>
<Canvas Height="120">
<Rectangle Canvas.Left="10" Canvas.Top="10" Height="100" Width="100" Fill="Red"/>
<Rectangle Canvas.Left="120" Canvas.Top="10" Height="100" Width="100" Fill="Green"/>
</Canvas>
<Grid HorizontalAlignment="Left">
<Rectangle Margin="10,10,10,10" Height="100" Width="100" Fill="Red" HorizontalAlignment="Left"/>
<Rectangle Margin="120,10,10,10" Height="100" Width="100" Fill="Green" HorizontalAlignment="Left"/>
</Grid>
</StackPanel>
</Grid>
的高度,因为它不会自动调整大小。在第二种情况下,我们使用Canvas
来模拟绝对定位,Margin
大小适应其内容的大小。