如果内容较小,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>
我有一些用户控件,其内容类似于 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>