我有一些用户控件,其内容类似于表格。如果你看一下XAML,MainGrid实际上代表了'table'。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
...
<ScrollViewer AutomationProperties.AutomationId="SchedulerScrolViewer" Grid.Row="1" Grid.Column="1" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" VerticalAlignment="Stretch">
<Grid x:Name="MainGrid" />
</ScrollViewer>
MainGrid位于滚动查看器中,因为我可以有100行和100列,例如,对于这种情况,代码工作得很好。 但是,请考虑下一个案例。
可用窗口高度例如是500像素。在MainGrid中,我有两行,高度为25.所以我希望我的MainGrid只占用50像素(25,25),并且不使用450像素。
由于<RowDefinition Height="*" />
我实际得到的MainGrid需要500像素(25,475)。我怎样才能改变这种行为?
我想过这样的事情
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="{Binding CalculatedHeight}" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="{Binding CalculatedWidth}" />
</Grid.ColumnDefinitions>
计算高度将在下一路计算
if(content height > main grid actual height)
{
CalculatedHeight = main grid actual height; // I need scroll viewer
}
else
{
CalculatedHeight = content height;
}
但在这种情况下,我必须注意窗口扩展器(如果扩展器扩展我有更少的空间),调整等等,我不确定这是一个好方法。
如果我设置<RowDefinition Height="Auto" />
滚动查看器不起作用,因为“自动”意味着一行的高度与其中的元素一样多。
你知道如何实现这个吗?
答案 0 :(得分:1)
试试这个:
<Grid x:Name="OuterGrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" MaxHeight="{Binding ElementName=InnerGrid, Path=ActualHeight, FallbackValue=1}" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0">sdfsdfs</TextBlock>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible">
<Grid x:Name="InnerGrid" Height="Auto">
<TextBlock>
jhdsfksjdhf
<LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak />
</TextBlock>
</Grid>
</ScrollViewer>
</Grid>
初始高度需要FallBackValue
...
答案 1 :(得分:1)
我找到了一个非常简单的解决方案。关键部分是VerticalAlignment =&#34; Top&#34;。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0">...</TextBlock>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible">
<Grid x:Name="MainGrid" VerticalAlignment="Top" />
</ScrollViewer>
</Grid>