我在 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 保持其高度,这当然不会。
希望我只是忽略了一些明显的东西..
谢谢!