无法在WPF TextBlock中获取垂直滚动条

5
我正在使用 wpf TextBlock 控件 (.Net 3.5) 显示文本。文本块的内容根据用户在列表框中选择的内容而变化。文本会自动换行,因此我不需要水平滚动条。但是,通常有更多的文本超过了窗口可以显示的数量,因此我需要一个垂直滚动条。
当我开始搜索时,很快发现答案是将 TextBlock 包装在 ScrollViewer 中。然而,它不起作用 (TM),我希望有人能帮助我弄清楚原因。
这是 UI 代码的结构:
<Window x:Class=..>
    <StackPanel>
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Top"  Height="200"
                 SelectionChanged="listbox_changed" SelectionMode="Single">
        </ListBox>
        <Button Click="Select_clicked">Select</Button>
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <TextBlock Name="textblock" TextWrapping="Wrap"/>
        </ScrollViewer>
    </StackPanel>
</Window>

当用户在列表框中选择一个项目时,与该项目相关的一些文本会显示在TextBlock中。我原以为代码就足够了,但它从未提供滚动条。
搜索和实验给了我两个线索:问题的根源可能与我动态更新TextBlock内容有关,并且TextBlock不会根据新内容自动调整大小。我找到了一篇相关的帖子,说通过将TextBlock的高度设置为其ActualHeight(在更改其内容后),它会起作用。但它并没有(我看不到这方面的效果)。
其次,在设计时间内设置ScrollViewer的高度,那么我确实会得到垂直滚动条。例如,如果我在上面的xaml中将其设置为300,则结果几乎是好的,因为首次打开的窗口包含一个带有垂直滚动条的TextBlock,仅当我需要它时。但是,如果我使窗口变大(在运行时使用鼠标调整其大小),则ScrollViewer不会利用新的窗口大小,而是保持其高度与xaml相同,这当然不行。
希望我只是忽略了一些显而易见的东西。。
谢谢!
1个回答

10

由于您的 ScrollViewer 处于 StackPanel 中,它将获得尽可能多的垂直空间来显示其内容。

您需要使用限制垂直空间的父面板,例如 DockPanel 或 Grid。

<DockPanel>
    <ListBox DockPanel.Dock="Top" HorizontalAlignment="Stretch"
             VerticalAlignment="Top"  Height="200"
             SelectionChanged="listbox_changed" SelectionMode="Single">
    </ListBox>
    <Button DockPanel.Dock="Top" Click="Select_clicked">Select</Button>
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <TextBlock Name="textblock" TextWrapping="Wrap"/>
    </ScrollViewer>
</DockPanel>

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