如果内容较小,WPF 比 * 占用更少 space

WPF take up less space than * if content is smaller

我有一些用户控件,其内容类似于 table。如果您查看 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 列,对于这种情况,代码工作得很好。 但是,请考虑下一个案例。

可用 window 高度例如为 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>

CalculatedHeight 将在下一个方法中计算

if(content height > main grid actual height)
{
    CalculatedHeight = main grid actual height; // I need scroll viewer
}
else
{
    CalculatedHeight = content height;
}

但在那种情况下,我必须监视 window 扩展器(如果扩展器被扩展,我有更少的 space)、调整大小等,我不确定这是不是一个好方法。

如果我设置 <RowDefinition Height="Auto" /> 滚动查看器不起作用,因为“自动”意味着为一行指定的高度与其中的元素所需的高度相同。

你知道如何实现吗?

试试这个:

<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...

我找到了一个非常简单的解决方案。关键部分是VerticalAlignment="Top"。

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