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

时间:2011-04-11 12:13:49

标签: wpf textblock scrollbars

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

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