WPF大小调整Grid.Row到内容

时间:2013-09-10 20:38:28

标签: c# wpf listbox gridpanel sizetocontent

我有一个使用SizeToContent="WidthAndHeight"的窗口,我有一个包含三行的列。行定义如下:

<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>

内容由上面一行的另一个Grid面板组成。每个面板都包含一个标签和一个ListBox。 ListBox动态添加或删除其内容。因此,它可能有一个项目,或者它可能有100个项目。

我的问题是:当我的应用程序启动时,上面提到的三个行的大小与其中的内容相匹配。所以它看起来很整洁。如果第一行只包含ListBox中的一个项目,它的大小就足以适合这些项目。另外两行(如果内容过满)将剩余的空间分成两半,如果用户想要查看每个空格中的溢出,则可以看到它们的滚动条。但是,只要我重新调整主窗口的大小,这三行就会立即重新调整大小,使每个行的高度完全相同,无论其中的内容量是多少。

我尝试在外部网格的行定义中使用Height="Auto";但是,它会确定每一行的大小以精确匹配内容,从而导致它们从屏幕溢出,而无需启用滚动条。

我已经尝试了我所知道的每一个设置(关键:知道),我无法解决它。现在我摆脱了SizeToContent,以便不会发生奇怪的错误,但无论内容的数量多少,行的大小都是相互成比例的...而且我喜欢它的另一种方式。我不希望每个行都有静态高度,而是让它们根据内容的大小动态重新调整大小,而不会离开屏幕。

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

在您的XAML中,您可以绑定到ViewModel中的属性

<Grid.RowDefinitions>
    <RowDefinition Height="{Binding Row1Height}"/>
    <RowDefinition Height="{Binding Row2Height}"/>
    <RowDefinition Height="{Binding Row3Height}"/>
</Grid.RowDefinitions>

然后在你的ViewModel

public int Row1Height { get; set; }
public int Row2Height { get; set; }
public int Row3Height { get; set; }

并且有一些计算,一旦你有内容就会填充该值。

答案 1 :(得分:1)

要做到正确,您必须制作自己的自定义Panel,它比标准Grid更智能地处理尺寸分布。这个项目可能是一个很好的起点:ConstrainingStackPanel

答案 2 :(得分:0)

假设我正确理解了您的问题,您是否尝试将其包装在ScrollViewer中并关闭了ListView的scollbar?

我发现WPF中的布局渲染既可以是正面也可以是拐杖。在内容大小调整方面,有时候让它正常工作会很痛苦。

如果ScrollViewer不是你想采取的方法,你可以通过编写某种附加行为(我过去已经这样做)轻松完成这样的事情,但在这种情况下,这样做有点过分了。 / p>

ScrollViewer方法示例:

<Grid>
  <ScrollViewer>
        <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
  :
  :
  :
  </ScrollViewer>
</Grid>