如何折叠 RowDefinition?

9

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

有没有一种方法可以折叠RowDefinition/Grid.Row?

感谢您的关注。


1
可能是WPF中隐藏网格行的重复问题。 - Palec
6个回答

10

您可以设置RowDefinition.Height = "Auto"并为该行中实际可视元素分配固定高度。这样,当可视元素明显折叠时,行不会占用分配给行定义的固定高度。


7

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>

7

如果你的行高度使用星号值,在想要折叠的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>

2
您可以在这里看到一个在网格中操作行和列的示例。即使文档是针对 .Net(WPF),它仍然适用于WP7/Silverlight。
我个人认为在这种方式中使用网格之前应该三思。也许,您尝试的任何内容都可以使用 stackpanel 或其他开箱即用的容器控件来实现。

仅为完成,我使用了grid.Rowdefinitions.RemoveAt(index)。我同意在这种情况下放置StackPanel可能是更好的选择。 - Manish Basantani

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

2
这种做法非常不符合MVVM的规范,仅供参考。 - Dan

0
一个简单的解决方案(使用您知道控件将展开到的高度):
<RowDefinition MaxHeight="30"/>

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

这对我很有用,因为我只需要将标志设置为 Collapse / Visible 一次,不确定如果您想在运行时切换可见性会如何工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接