如果内容较小,WPF占用的空间小于*

时间:2017-03-23 15:30:33

标签: c# wpf scroll grid resize

我有一些用户控件,其内容类似于表格。如果你看一下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" />滚动查看器不起作用,因为“自动”意味着一行的高度与其中的元素一样多。

你知道如何实现这个吗?

2 个答案:

答案 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>