如何自动调整容器元素以确保可见性问题的最小高度?

时间:2011-06-26 20:26:05

标签: c# wpf xaml autosize

我有一个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创建高度。

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

1 个答案:

答案 0 :(得分:2)

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

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

相比之下,Grid是迄今为止灵活的布局元素,可用于布局包含行和列的网格,有或没有跨越等。这就是为什么它是创建新{时的默认值{1}}或Window。但与UserControl不同,Canvas的大小,未指定且未拉伸到可用空间时,是其所有子项大小的并集。

Grid还具有以下属性:如果它有多个子节点且未放入行或列,则它们重叠彼此叠加,后面的子节点在Z顺序中更高。这就像Grid但没有CanvasCanvas.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大小适应其内容的大小。