2011-04-11 72 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