如何折叠RowDefinition?

时间:2011-10-13 03:27:08

标签: wpf visibility

我需要删除Grid.Row占用的空间。我能够折叠(删除)我放在Grid.Row中的控件,但由于RowDefinition具有固定的大小(高度),即使在删除子控件后我仍然会看到一个空行。

有没有办法折叠RowDefinition / Grid.Row?

感谢您的关注。

6 个答案:

答案 0 :(得分:8)

您可以设置RowDefinition.Height="Auto",并且可以为该行中的实际视觉分配固定高度。这样,当视觉明显地被碰撞时,该行不会占用分配给行定义的固定宽度。

答案 1 :(得分:5)

设置RowDefinition.Height ="Auto"不适合所有情况,因为我们经常需要*调整行数。

不是动态地/编程地从列表中添加和删除行,而是在下一行上拉伸第一行内容更容易,更安全。

这可以通过使用DataTrigger在网格上的第一个项目上设置Grid.RowSpan来完成。下面是一个完整的示例 - 只需将其粘贴到新的WPF窗口中即可查看它的实际效果。

  <Grid>
        <Grid.Resources>

            <BooleanToVisibilityConverter x:Key="visConverter"></BooleanToVisibilityConverter>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid Grid.Row="0" Background="Orange">
            <Grid.Style>
                <Style TargetType="Grid">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=toggle1, Path=IsChecked}" Value="False">
                            <Setter Property="Grid.RowSpan" Value="3"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Grid.Style>
        </Grid>
        <GridSplitter Grid.Row="1" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch" Height="3" 
                      Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}"></GridSplitter>
        <Grid Name="bottomGrid" Grid.Row="2" Background="LightBlue" 
              Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}">
        </Grid>
        <ToggleButton Name="toggle1" VerticalAlignment="Top">Hide/Show</ToggleButton>
</Grid>

答案 2 :(得分:2)

对于要折叠的行,将具有触发器的样式应用于RowDefinition绝对是可以的。当您拥有身高的星星值时,这会有所帮助。

例如,如果您想在结果存在之前隐藏结果部分(例如零计数ObservableCollection),则以下内容可能会有用。

<RowDefinition>
    <RowDefinition.Style>
        <Style>
            <Setter Property="RowDefinition.Height" Value="2*"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Results.Count}" Value="0">
                    <Setter Property="RowDefinition.Height" Value="0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </RowDefinition.Style>
</RowDefinition>

答案 3 :(得分:1)

您可以看到here操作网格中的行和列的示例。即使文档是针对.Net(WPF),它仍然与WP7 / Silverlight相关。

在以这种方式使用网格之前,我个人会三思而后行。可能是,无论您正在尝试什么,都可以使用stackpanel或任何其他开箱即用的容器控件来实现。

答案 4 :(得分:1)

首先为您的网格设置Name。最初,通过XAML属性设置行高:

<Grid Name="GridSize">
     <Grid.RowDefinitions>
        <RowDefinition Height="3*"></RowDefinition>
        <RowDefinition Height="1*"></RowDefinition>
        <RowDefinition Height="2*"></RowDefinition>
     </Grid.RowDefinitions>
     <Grid Name="A" Grid.Row="0""></Grid>
     <Grid Name="B" Grid.Row="1""></Grid>
     <Grid Name="C" Grid.Row="2""></Grid>
</Grid>

如果要折叠RowDefinition

A.Visibility = Visibility.Collapsed;
GridSize.RowDefinitions[0].Height = new GridLength(0);

当你想让它再次可见时:

A.Visibility = Visibility.Visible;
GridSize.RowDefinitions[0].Height = new GridLength(3, GridUnitType.Star);

答案 5 :(得分:0)

一个简单的解决方案(使用您知道控件将扩展到的高度):

<RowDefinition MaxHeight="30"/>

然后确保该Row内的所有控件都将使用Visibilitty="Collapsed"

这对我有用,因为我只需要将标志设置为“折叠/可见”即可,如果您想在运行时切换可见性,则不确定该如何工作。