WPF中可滚动的文本框因大小超出容器而无法滚动

3
这个文本框不让我滚动。我很确定是因为它在垂直方向上扩展以“显示”所有文本。但是,它正在超出(并且在下面)它所在的网格行的底部,因此文本未被显示-但滚动条已被禁用(因为它认为没有理由显示它们)。
结果是我看到文件中的文本顶部,当它到达它所在的网格单元格底部时,它被截断。
我需要做什么来告诉控件:“扩展到你所在的网格单元格的宽度和高度,并在文本无法适合该空间时显示垂直滚动条”?
<StackPanel Grid.Column="1" Grid.Row="1">
    <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible">
    <TextBlock x:Name="longText" Foreground="White" FontFamily="Times New Roman" FontSize="24" TextWrapping="Wrap" />
    </ScrollViewer>
</StackPanel>
3个回答

2

你为什么需要一个StackPanel呢?我建议你将它移除并将Grid.ColumnGrid.Row放置在ScrollViewer中:

<ScrollViewer Grid.Column="1" Grid.Row="1"  CanContentScroll="True" VerticalScrollBarVisibility="Visible">
        <TextBlock x:Name="longText" Foreground="White" FontFamily="Times New Roman" FontSize="24" TextWrapping="Wrap" />
</ScrollViewer>

2
如果您将它更改为这样,它就可以工作了。
<ScrollViewer Grid.Column="1" Grid.Row="1" VerticalScrollBarVisibility="Auto">
    <StackPanel>
        <TextBlock x:Name="longText" Foreground="White" FontFamily="Times New Roman" FontSize="24" TextWrapping="Wrap" />
     </StackPanel>
</ScrollViewer>

但同时,您必须确保网格的高度设置为*或固定大小:

<Grid>
   <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/> //Or whatever size you want
      <RowDefinition Height="*"/> 
    </Grid.RowDefinitions>

<ScrollViewer Grid.Column="1" Grid.Row="1" VerticalScrollBarVisibility="Auto">
    <StackPanel>
        <TextBlock x:Name="longText" Foreground="White" FontFamily="Times New Roman" FontSize="24" TextWrapping="Wrap" />
     </StackPanel>
</ScrollViewer>

</Grid>

顺便提一下,如果你的StackPanel里面没有更多控件,它就是多余的。
编辑: 首先,像mm8user2837961所解释的那样,在StackPanel中使用ScrollViewer是没有意义的,因为StackPanel可以无限扩展。只有当ScrollViewer内的对象比其自身的大小大时,ScrollViewer才能起作用。通过将你的Grid row的大小设置为*,你为该行分配了网格的剩余空间,这意味着属于该行的项目得到了固定的大小。如果你的TextboxScrollViewer的大小大,那么ScrollBarVisibility就会被触发。

它有效了!这是因为 grid.row 和 grid.column 不属于文本框,而是属于多余的 stack panel 吗? - DrDamnit

1
将ScrollViewers放入StackPanels是一个不好的想法。这是因为如果StackPanel的Orientation属性设置为水平,则使用无限水平空间来测量其子元素,如果设置为垂直,则使用无限垂直空间来测量其子元素。请参考我在这里的答案以获取更多信息: 水平滚动条对于StackPanel不起作用 这基本上意味着在此处ScrollViewer元素具有无限的高度,因此不显示垂直滚动条。
因此,正如@user2837961建议的那样,您应该简单地摆脱StackPanel:
<ScrollViewer Grid.Column="1" Grid.Row="1" VerticalScrollBarVisibility="Visible">
    <TextBlock x:Name="longText" Foreground="White" FontFamily="Times New Roman" FontSize="24" TextWrapping="Wrap" />
</ScrollViewer>

还要确保在可视树上方没有其他 StackPanel。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接