wpf ScrollViewer在布局发生某些更改后停止工作

tvmytwxo  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(149)

你知道为什么我的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>

不工作的一个有自动高度启用,我以为这是问题,但删除后,错误仍然发生。

jecbmhm3

jecbmhm31#

ScrollViewer的情况下,它总是需要一个大小约束。
使用*的行高意味着行内的元素可以使用剩余的可用大小。这将导致具体的高度值(无论可用高度的剩余高度是多少)。
Auto的高度意味着行内的元素可以有任何它想要的大小-即使这意味着它将超过可用空间(拉伸到无穷大)。
现在UI元素有不同的大小调整行为,像StackPanel这样的UI元素努力占据尽可能少的空间,而像ScrollViewer这样的控件总是占据尽可能多的空间(它是贪婪的)。这意味着,如果ScrollViewer在一个没有大小限制的容器中(例如,通过将父级Grid的行高设置为Auto),它将拉伸以占据无限大小。
因为所有的内容都可以容纳在一个无限大的区域中,所以ScrollViewer的子元素现在总是可以容纳的。现在所有的内容都可以容纳在可用区域中,可滚动区域变成了0:因为滚动条的目的是允许将不适合可用空间的元素带入视图。如果所有内容都适合,则没有任何内容可以滚动到视图中。
为了解决这个问题,ScrollViewer必须有一个大小约束。要么由父容器隐式地施加,例如,通过将Grid的行高设置为Auto以外的值,要么通过为ScrollViewer显式地提供HeightWidth

相关问题