嵌套 ItemsControl 的拉伸高度

Posted

技术标签:

【中文标题】嵌套 ItemsControl 的拉伸高度【英文标题】:Stretch height of nested ItemsControl 【发布时间】:2013-08-20 13:42:13 【问题描述】:

在 MainWindow 上,我有一个 ItemsControl,我将其添加到 UserControls,并且说 UserControl 还包含一个 ItemsControl,其中包含其他 UserControls

问题是第二个 ItemsControl 中的许多项目没有显示,因为它们超出了 UserControl 在 MainWindow 上显示的高度。

如何确保第一个 ItemsControl 中的 UserControls 始终伸展到足以显示其 ItemsControl 中的所有 UserControls?为了反复试验,我尝试通过 ItemTemplate 进行拉伸,但这并没有改变任何事情。

<Window x:Class="X.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>    
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <ItemsPresenter Grid.Row="0" Grid.Column="0" DataContext="Binding"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ItemsControl Grid.Row="0" x:Name="ic" ItemTemplate="DynamicResource DataTemplate1"/>
    </Grid>
</Window>

--

<UserControl x:Class="X.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="113" Width="209">
    <UserControl.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <ItemsPresenter DataContext="Binding"/>
            </Grid>
        </DataTemplate>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Content="Label" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <ItemsControl Grid.Row="1" x:Name="ic" Margin="0,36,0,0" ItemTemplate="DynamicResource DataTemplate1"/>
    </Grid>
</UserControl>

--

<UserControl x:Class="X.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="40" Width="64">
    <Grid>
        <Label Content="Label2" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>

    </Grid>
</UserControl>

【问题讨论】:

您的问题不仅仅是两个 UserControl 都指定了高度/宽度,是吗(第一个不会拉伸)? @Chris 这确实成功了。我认为用户控件的宽度和高度只会影响设计时间,请问您能否将其添加为答案? 会做,很高兴原来是问题所在。 =D 稍作跟进,您可以使用命名空间xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 使用d:DesignHeight="500" d:DesignWidth="500" 设置设计时的高度和宽度。 Visual Studio 2012 在创建新的UserControl 时似乎默认执行此操作 @Chris 是的,这也是它默认为我所做的,但是当我在 GUI 编辑器中调整窗口大小时,它显然将它从 DesignHeight 更改为正常高度,这就是它没有发生的原因对我来说,这是造成它的原因。感谢您的提示;D 【参考方案1】:

从我上面的评论中添加,结果证明是问题所在。

您的用户控件明确设置了HeightWidth,这意味着它们不会自动调整大小/拉伸以适应您想要的子控件。

删除Height(最好是Width),应该可以解决问题:

<UserControl x:Class="X.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" />
    <!-- Your Code -->         
</UserControl>

【讨论】:

以上是关于嵌套 ItemsControl 的拉伸高度的主要内容,如果未能解决你的问题,请参考以下文章

具有 display:table 样式的嵌套 div 在 IE 中不会拉伸到 100% 高度

在 flexbox 中使用“高度:100%”和“对齐项目:拉伸”[重复]

如何使行拉伸剩余高度

UIScrollView 中的嵌套 UIStackView 子项不会拉伸以填充

WPF ItemsControl 取消选中item项,滚动条自动跑到该item顶部的问题

控制图片外框高度,让布局正常,图片不出现拉伸