WPF中的可滚动文本框不会滚动,因为它比容器大

时间:2017-02-03 13:37:57

标签: c# wpf vb.net

这个文本框永远不会让我滚动。我很确定这是因为它是垂直扩展以“显示”所有文本。但是,它正在扩展到它所在的网格行的底部(并在其下面),因此文本没有显示 - 但是滚动条被禁用(因为它认为没有理由显示它们)。

结果是我看到文件中文本的顶部,当它到达网格单元格底部时会被切断。

告诉控件我需要做什么:“扩展到您所在的网格单元格的宽度和高度,并在文本不适合该空间时显示垂直滚动条”?

<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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

将ScrollViewers放在StackPanels中是个坏主意。这是因为如果StackPanel的Orientation属性设置为Horizo​​ntal而无限的垂直空间(如果设置为Vertical),则StackPanel将测量具有无限水平空间的子级。有关详细信息,请参阅我的答案:

Horizontal scroll for stackpanel doesn't work

这基本上意味着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。

答案 2 :(得分:1)

如果你把它改成这个就行了。

<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解释了ScrollviewerStackPanel内没有意义,因为StackPanel可以扩展无限。 ScrollViewer仅在其中的对象大于自身大小时才有效。通过为Grid row提供*的大小,您可以为该行分配网格的剩余空间,这意味着属于该行的项目将获得固定大小。如果您的Textbox大于ScrollViewer尺寸,则会触发ScrollBarVisibility