1

我有一个 ItemsControl,想从我的 CustomObject 中显示一些字符串。

就像是

String A
String B
String C

其中字符串 A 和 B 可以是多行,但 C 不能。我在想Height="Auto"和一个DockPanel。字符串 A 的高度应该是它需要的高度。字符串 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 创建高度。

如果每个项目的高度未知,我该怎么做?

4

1 回答 1

2

有很多布局元素,虽然这为您提供了很多选择,但很难确定在任何给定情况下哪个布局元素是正确的。

通常,aCanvas因其方便的固定定位能力而有用。Canvas.Left它允许使用和Canvas.Top附加属性将任何东西放置在任何地方。但是因为 a 的大小Canvas是固定的并且不依赖于它的子元素,所以它很难用于可变大小的内容。的父级与 的Canvas子级的大小“绝缘” Canvas,这在某些情况下实际上很有用。

相比之下,Grid到目前为止,a 是灵活的布局元素,对于布局带有行和列、有或没有跨越等的网格很有用。这就是为什么当你创建一个新的Windowor时它是默认的UserControl。但与 a 不同Canvas, 的大小Grid在未指定且未拉伸到可用空间时,是其所有子项大小的并集。

AGrid还有一个属性,如果它有几个孩子并且它们没有被放置在行或列中,那么它们就会相互重叠,后面的孩子在 Z 顺序中更高。这就像一个Canvas没有Canvas.Leftand Canvas.Top,我们怎么能精细地控制孩子的位置呢?

Let's look at an example. Here is a Canvas with two rectangles placed side-by-side with a little space, and a Grid doing the same thing:

<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>

In the first case we had to specific the height of the Canvas because it doesn't auto-size. In the second case, we used Margin to simulate absolute positioning and the Grid size adapts to the size of its content.

于 2011-06-26T22:35:24.133 回答