【问题标题】:Adapting grid with expanders to available height使用扩展器使网格适应可用高度
【发布时间】:2015-05-07 09:17:10
【问题描述】:

我有一个“一堆”扩展器,它们可以独立打开/关闭。

除了一个之外,所有的都有一个固定的高度(展开时)。另一个有MinHeight,但我希望它能够拉伸以填充剩余的可用高度。如果扩展器的组合高度大于可用高度,则会出现滚动条。

我已经使用Grid 做到了这一点,每个网格有一个扩展器,Height 行设置为* 用于拉伸扩展器,Auto 用于其他扩展器。

这工作正常,除了在一种情况下:如果可伸缩扩展器折叠,并且其他扩展器的组合高度小于可用高度,那么拉伸扩展器无论如何都会填充剩余空间,只是它的内容被折叠了,所以我得到了一大块背景颜色。

我也尝试过 StackPanel 或嵌套网格,但在不创建其他问题的情况下无法解决该问题。

有什么想法吗?

(将其粘贴到窗口中)

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*" MinHeight="23"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Expander IsExpanded="False" Grid.Row="0" Header="Fixed">
            <Border Background="Red" Height="200" />
        </Expander>
        <Expander IsExpanded="False" Grid.Row="1" Header="Stretchy">
            <Border Background="Blue" />
        </Expander>
        <Expander IsExpanded="False" Grid.Row="2" Header="Fixed">
            <Border Background="Green" Height="300" />
        </Expander>
    </Grid>
</ScrollViewer>

【问题讨论】:

  • 你能插入你的 xaml 吗?或多或少很清楚,但我想看看:)
  • @sac1 你的愿望就是我的命令...

标签: .net wpf xaml


【解决方案1】:

默认情况下,扩展器占用所有可用空间。它通过将VerticalAlignmentHorizontalAlignment 设置为Stretch 来实现这一点。

要解决您的问题,请将VerticalAlignment 设置为Top。然后扩展器只占用它需要的空间。

XAML 如下所示:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Expander Grid.Row="0" Background="Green">
        <Button Height="50">test</Button>
    </Expander>
    <Expander Grid.Row="1" Background="Red">
        <Button Height="50">test</Button>
    </Expander>
    <Expander Grid.Row="2" Background="Blue" VerticalAlignment="Top">
        <Button Height="50">test</Button>
    </Expander>
</Grid>

编辑:

您应该将第二行的Height 绑定到弹性扩展器的IsExpanded。如果展开,则设置为*,否则设置为auto。您可以使用ValueConverter 来执行此操作。

编辑 2:

正如所承诺的解决您问题的标记和值转换器:

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="{Binding ElementName=Stretchy, Path=IsExpanded, Converter={StaticResource converter}}" MinHeight="23" />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Expander IsExpanded="False" Grid.Row="0" Header="Fixed">
            <Border Background="Red" Height="200" />
        </Expander>
        <Expander x:Name="Stretchy" IsExpanded="False" Grid.Row="1" Header="Stretchy" VerticalAlignment="Stretch" MinHeight="100">
            <Border Background="Blue" />
        </Expander>
        <Expander IsExpanded="False" Grid.Row="2" Header="Fixed">
            <Border Background="Green" Height="300" />
        </Expander>
    </Grid>
</ScrollViewer>

值转换器:

public class BoolToHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool? v = value as bool?;
        if (v == false)
            return new GridLength(1, GridUnitType.Auto);
        else
            return new GridLength(1, GridUnitType.Star);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 谢谢,我发布了我的示例代码,您可能想尝试一下。您的修复确实有助于不给我蓝色背景的大斑点,但我仍然有弹性扩展器无法正确折叠的问题。
  • 这不是Expander的问题,是Grid的问题。如果你用Height=* 标记中间的那个,那么不管它的内容如何,​​它都会占用剩下的空间。在你的情况下,我建议将高度更改为 auto
  • @Benjol 好的,我想我现在明白你的问题了。澄清一下:如果所有扩展器的组合高度小于窗口高度,即使超出了它的需要,Stretchy 扩展器仍应使用所有剩余空间?
  • @Benjol 现在答案应该完全符合您的需要;)
  • 非常感谢您花时间填写您的答案。我对其进行了微调以使其对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2020-03-25
相关资源
最近更新 更多