我有一个使用SizeToContent="WidthAndHeight"
的窗口,我有一个包含三行的列。行定义如下:
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
内容由上面一行的另一个Grid面板组成。每个面板都包含一个标签和一个ListBox。 ListBox动态添加或删除其内容。因此,它可能有一个项目,或者它可能有100个项目。
我的问题是:当我的应用程序启动时,上面提到的三个行的大小与其中的内容相匹配。所以它看起来很整洁。如果第一行只包含ListBox中的一个项目,它的大小就足以适合这些项目。另外两行(如果内容过满)将剩余的空间分成两半,如果用户想要查看每个空格中的溢出,则可以看到它们的滚动条。但是,只要我重新调整主窗口的大小,这三行就会立即重新调整大小,使每个行的高度完全相同,无论其中的内容量是多少。
我尝试在外部网格的行定义中使用Height="Auto"
;但是,它会确定每一行的大小以精确匹配内容,从而导致它们从屏幕溢出,而无需启用滚动条。
我已经尝试了我所知道的每一个设置(关键:知道),我无法解决它。现在我摆脱了SizeToContent
,以便不会发生奇怪的错误,但无论内容的数量多少,行的大小都是相互成比例的...而且我喜欢它的另一种方式。我不希望每个行都有静态高度,而是让它们根据内容的大小动态重新调整大小,而不会离开屏幕。
有没有办法解决这个问题?
答案 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>