2011-04-11 102 views
3

我在wpf TextBlock控件(.Net 3.5)中呈现文本。文本块的内容取决于用户在列表框中选择的内容。文字包装,所以我不需要水平滚动条。但是,通常有更多的文本不能显示窗口的数量,所以我需要一个垂直滚动条。无法在WPF TextBlock中获得垂直滚动条

当我开始搜索时,我很快发现答案是将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保持其高度,当然这不会。

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

谢谢!

回答

8

由于您的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> 
+1

使用Grid而不是StackPanel取得了诀窍。谢谢! – Kristoffer 2011-04-11 13:27:49