1

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

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

内容由上面每一行的一个其他网格面板组成。这些面板中的每一个都包含一个标签和一个列表框。ListBox 动态添加或删除其内容。因此,它可能有一项,也可能有 100 项。

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

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

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

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

4

3 回答 3

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

一旦你有了内容,就可以进行一些计算来填充该值。

于 2013-09-10T21:21:36.273 回答
1

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

于 2013-09-11T00:33:24.423 回答
0

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

我发现 WPF 中的布局渲染既可以是积极的,也可以是拐杖。在内容大小方面,有时要让它正常工作是一件很痛苦的事情。

如果 ScrollViewer 不是您想要采用的方法,您可以通过编写某种附加行为来轻松完成类似的事情(我过去曾这样做过),但在这种情况下,这有点矫枉过正。

ScrollViewer 方法的示例:

<Grid>
  <ScrollViewer>
        <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
  :
  :
  :
  </ScrollViewer>
</Grid>
于 2013-09-11T00:48:30.617 回答