你知道为什么我的scrollviewer不工作吗?(WPF)
<Grid Grid.Row="1" Grid.Column="1" Width="350">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Margin="10,0,0,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0">
<Run Text="{Binding SelectedItem.Name}" FontFamily="/Fonts/#Cascadia Mono" FontWeight="SemiBold" FontSize="18"/>
<Run Text=" "/>
<Run Text="{Binding SelectedItem.Version}" Foreground="Gray" FontFamily="Open Sans" FontSize="16"/>
</TextBlock>
<Button x:Name="installButton" Grid.Column="1" Content="{Binding InstallButtonHeader}"
Visibility="Collapsed" Margin="10,-5,0,-10" Command="{Binding InstallCommand}"/>
</Grid>
<TextBlock Text="{Binding SelectedItem.Author}" FontSize="12" Foreground="Gray" FontFamily="Open Sans"/>
</StackPanel>
<ScrollViewer Grid.Row="2" Margin="10" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled">
<TextBlock Text="{Binding SelectedItem.LongDescription}" TextWrapping="Wrap"/>
</ScrollViewer>
</Grid>
它在这里工作没有问题:
<Grid Grid.Row="1" Grid.Column="1" Width="350">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Margin="10,0,0,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding SelectedItem.Name}" FontFamily="/Fonts/#Cascadia Mono" FontWeight="SemiBold" FontSize="18"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding SelectedItem.Version}" Foreground="Gray" FontFamily="Open Sans" FontSize="16" VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Text="{Binding SelectedItem.Author}" FontSize="12" Foreground="Gray" FontFamily="Open Sans"/>
</StackPanel>
<Button x:Name="installButton" Grid.Row="2" Content="{Binding InstallButtonHeader}" Visibility="Collapsed" Margin="10,10,0,0" Command="{Binding InstallCommand}"/>
<ScrollViewer Grid.Row="3" Margin="10" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<TextBlock Text="{Binding SelectedItem.LongDescription}" TextWrapping="Wrap"/>
</ScrollViewer>
</Grid>
不工作的一个有自动高度启用,我以为这是问题,但删除后,错误仍然发生。
1条答案
按热度按时间jecbmhm31#
在
ScrollViewer
的情况下,它总是需要一个大小约束。使用
*
的行高意味着行内的元素可以使用剩余的可用大小。这将导致具体的高度值(无论可用高度的剩余高度是多少)。Auto
的高度意味着行内的元素可以有任何它想要的大小-即使这意味着它将超过可用空间(拉伸到无穷大)。现在UI元素有不同的大小调整行为,像
StackPanel
这样的UI元素努力占据尽可能少的空间,而像ScrollViewer
这样的控件总是占据尽可能多的空间(它是贪婪的)。这意味着,如果ScrollViewer
在一个没有大小限制的容器中(例如,通过将父级Grid
的行高设置为Auto
),它将拉伸以占据无限大小。因为所有的内容都可以容纳在一个无限大的区域中,所以
ScrollViewer
的子元素现在总是可以容纳的。现在所有的内容都可以容纳在可用区域中,可滚动区域变成了0
:因为滚动条的目的是允许将不适合可用空间的元素带入视图。如果所有内容都适合,则没有任何内容可以滚动到视图中。为了解决这个问题,
ScrollViewer
必须有一个大小约束。要么由父容器隐式地施加,例如,通过将Grid
的行高设置为Auto
以外的值,要么通过为ScrollViewer
显式地提供Height
和Width
。