【问题标题】:Gridsplitter: limit row heights to window sizeGridsplitter:将行高限制为窗口大小
【发布时间】:2013-05-26 22:49:53
【问题描述】:

我刚刚开始尝试使用 gridsplitters 并且偶然发现了一个非常奇怪的行为,我似乎无法修复它。显然其他人也有类似的问题(根据谷歌),但没有有用的 cmets。

我有一个有 2 行的网格。在启动时,底部的 Hight 为 250。顶行与 * 一起占据其余部分。当我使用拆分器调整行的大小时,第一行的行为与预期的一样。但是当我向上拖动拆分器并通过程序窗口时,底行的内容将从窗口中掉出(=向下移动直到它消失)。我希望我不能使每一行都大于父容器。

<Grid x:Name="grid_main" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition MinHeight="250"  Height="250"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="splitter" 
        ResizeDirection="Rows" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Width="Auto"
        Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0" ResizeBehavior="BasedOnAlignment" />
    <Grid Grid.Column="0" Grid.Row="0">
    </Grid>
    <Grid Grid.Column="0" Grid.Row="1">              
    </Grid>
</Grid>

这是我的代码。两行的内容再次托管在网格中,为简单起见已被删除。再次:调整顶行的大小可以正常工作。但底行可以调整为无穷大。如果我硬编码MaxHeight,它会按预期工作。但这必须取决于窗口大小。

【问题讨论】:

    标签: c# wpf resize grid gridsplitter


    【解决方案1】:

    尝试将您的第二个 RowDefinition 更改为以下内容:

    <RowDefinition MinHeight="250" MaxHeight="{Binding ElementName=grid_main, Path=ActualHeight}" Height="250"/>
    

    这将确保行高不会超过窗口大小。

    【讨论】:

    • 感谢您的回复。这样可行。但是为顶行实现MinHeight 被证明是......困难......在处理 WPF 时,我通常会诅咒它,在某些时候我有一个非常优雅的解决方案,让我觉得“哇,WPF毕竟真的很酷”。不确定我会在这个问题上达到这一点......
    • 我知道你的意思,我很多时候也有同样的感觉。有一个解决方案可以为顶行定义一个 MinHeight,它是否优雅值得商榷!如果您使用 MultiValueConverter,您可以像以前一样将 Grid 的 ActualHeight 和顶行 MinHeight 传递给它并返回差值。将此值用作第二行的最大高度。
    • 我使用了IValueConverter 来应用偏移量。
    【解决方案2】:

    Richard 的解决方案对我不起作用(网格的 ActualHeight 与行高一起超出了窗口大小)。

    使用 Snoop,我发现祖先 ContentPresenter 的 ActualHeight 没有增加。因此,下面的底行定义对我有用,尽管如果我在顶行或底行设置 MinHeight,我仍然会看到问题:

    <RowDefinition Height="430"
                   MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/>
    

    【讨论】:

      【解决方案3】:

      这个问题只是因为第二行有一个绝对高度。如果您真的想要绝对高度值,请尝试理查兹的解决方案。否则,只需在第二行也使用相对高度(例如 2*)。

      【讨论】:

        【解决方案4】:

        Grigory Zhadko 的回答对我很好。

        这段代码有问题

        gridBase.RowDefinitions[1].Height = (GridLength)gridLengthConverter.ConvertFrom("1");
        gridBase.RowDefinitions[3].Height = (GridLength)gridLengthConverter.ConvertFrom("1");
        

        我就这样修好了

        gridBase.RowDefinitions[1].Height = new GridLength(0.1, GridUnitType.Star);
        gridBase.RowDefinitions[3].Height = new GridLength(0.1, GridUnitType.Star);
        

        电网转换器完美运行

        【讨论】:

          猜你喜欢
          • 2013-03-17
          • 2022-01-16
          • 2018-09-20
          • 1970-01-01
          • 2019-11-26
          • 2011-10-16
          • 1970-01-01
          • 2013-03-31
          • 1970-01-01
          相关资源
          最近更新 更多