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

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

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

谢谢!

最佳答案

因为您的 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>

关于wpf - 无法在 WPF TextBlock 中获取垂直滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621086/

相关文章:

c# - 两个应用程序同时使用两个文本文件共享数据

c# - 自动滚动在子用户控件中不起作用

按需提供水平和垂直滚动条的 HTML 表格

css - Webkit 滚动条不接受 RGBa 值?

c# - MVVM C#WPF-更改observablecollection中的项目时UI不更新

wpf - 更改复选框大小 WPF

c# - 淡出一个窗口

wpf - 在 WPF 中将文本 block 添加到椭圆

wpf - 使textblock只读

c# - Viewbox中的文本 block 不是多行