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 保持其高度,这当然不会。

希望我只是忽略了一些明显的东西..

谢谢!

4

1 回答 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>
于 2011-04-11T12:45:25.070 回答