如何折叠 RowDefinition?

Posted

技术标签:

【中文标题】如何折叠 RowDefinition?【英文标题】:How to collapse a RowDefinition? 【发布时间】:2011-12-06 15:23:42 【问题描述】:

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

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

感谢您的关注。

【问题讨论】:

Hide grid row in WPF的可能重复 【参考方案1】:

您可以看到here 一个在网格中操作行和列的示例。即使文档适用于 .Net (WPF),它仍然适用于 WP7/Silverlight。

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

【讨论】:

为了完成,我使用了 grid.Rowdefinitions.RemoveAt(index)。我同意在这种情况下放置 StackPanel 可能是更好的选择。【参考方案2】:

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

【讨论】:

这是问题的简单答案。谢谢!。我知道它很老了,但你打了一个小错字,当你的意思是高度时写了宽度。【参考方案3】:

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

【讨论】:

【参考方案4】:

首先为您的网格设置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);

【讨论】:

这是一种非常非 MVVM 的方法,仅供记录。【参考方案5】:

绝对可以将带有触发器的样式应用于您要折叠的行的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>

【讨论】:

【参考方案6】:

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

<RowDefinition MaxHeight="30"/>

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

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

【讨论】:

以上是关于如何折叠 RowDefinition?的主要内容,如果未能解决你的问题,请参考以下文章

如何绑定到 RowDefinition 的高度?

wpf 如何修改 RowDefinition的高?

WPF 框架开发 ColumnDefinition 和 RowDefinition 的代码在哪

WPF DatePicker LostFocus 触发七次

如何为 Grid RowDefinition 高度变化设置动画(当 Height="Auto" 时)

代码中的 WPF 自动高度