我在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保持其高度,这当然不会。
希望我只是忽略了一些显而易见的事情......
谢谢!
答案 0 :(得分:9)
因为您的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>