2011-06-19 46 views
2

我在4行2列網格內有以下XAML。 Grid.ColumnDefinitions將ColumnDefinition Width的值設置爲*。如何讓TextBlock包裝或滾動FlowDocumentScrollViewer

<FlowDocumentScrollViewer Style="{StaticResource myFlowDoc}" 
           Grid.Row="4" 
           Grid.Column="1" > 
     <FlowDocument > 
      <Paragraph LineHeight="12" > 
       <ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}" /> 
       <TextBlock TextWrapping="Wrap" Text="{Binding /, Mode=OneWay}" /> 
      </Paragraph> 
     </FlowDocument> 
    </FlowDocumentScrollViewer> 

數據來自一個ObservaleCollection <字符串>和看起來很好和垂直滾動正確。但是,如果某個項目不能在TextBlock中水平放置,則文本塊將不會換行,並且FlowDocumentScrollViewer將不會顯示滾動條。查看文本的唯一方法是水平放大窗口。有誰知道我在做什麼錯了,爲什麼TextWrapping設置沒有兌現?

如果在這裏重要的是風格myFlowDoc

 <Style x:Key="myFlowDoc"> 
     <Setter Property="Control.Padding" 
       Value="0" /> 
     <Setter Property="FlowDocumentScrollViewer.IsToolBarVisible" 
       Value="True" /> 
     <Setter Property="Control.MinHeight" 
       Value="150" /> 
     <Setter Property="Control.BorderBrush" 
       Value="SteelBlue" /> 
     <Setter Property="Control.BorderThickness" 
       Value="2" /> 
     <Setter Property="Control.VerticalAlignment" 
       Value="Stretch" /> 
    </Style> 

[編輯1] 這裏是全屏,應該換一個錯誤消息。在這張圖片下面,我有一個只顯示窗口更寬的消息詳細區域,所以你可以看到整個消息。我也把整個xaml的用戶控制在https://gist.github.com/1036178#

[編輯2.1] @納維德的建議讓我間接地得到了答案。刪除「/」並將數據包裝到數據模板中似乎有用。這裏是新的XAML

<DataTemplate x:Key="StringCollection"> 
    <TextBlock TextWrapping="Wrap" Text="{Binding}" TextAlignment="Left"/> 
</DataTemplate> 
<!--... now down in the ItemsControl--> 
<ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}" 
      ItemTemplate="{StaticResource StringCollection}" /> 

Screenshot of window with text that doesn't fit but doesn't wrap Once the window is wider you can see the whole message

+0

我看不出任何問題,可以發送截圖? –

+0

我不知道什麼是最好的方式來感覺屏幕截圖,所以我只是編輯原始帖子,我有一個窗口在「正常」寬度的一個鏡頭,然後一個只是我已經做了詳細信息區域窗口足夠寬,以便您可以看到整個消息。我也建立了一個鏈接到完整的xaml文件。 – Tod

+0

你會描述嗎?' –

回答

2

使用本

<ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}">  
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock TextWrapping="Wrap" Text="{Binding /, Mode=OneWay}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

我剛試過但很不幸,我在使用ItemsSource之前得到一個「Items集合必須爲空」。 InvalidOperationException在App OnStartup覆蓋中。也就是說,調用堆棧只顯示OnStartup調用,並在window.Show()上拋出錯誤。我會環顧四周,看看是否可以發現更多關於導致此異常的原因。 – Tod

+0

好的 - 你和我之間,SO和WPF n C#2008我知道了。我不能直接將TextBlock放入ItemsControl中,因爲它與ItemsSource想要控制內容的事實相沖突。不過,我可以把一個DataTemplate放在那裏,並且做到了這一點。我將把修改後的代碼放在原始問題中。 1K感謝您向我展示燈光。 – Tod

+0

原來這只是OneWay綁定語法。我回到我原來的代碼,只是刪除了「/,Mode = OneWay」,現在它工作。這種斜線的奇怪語法是我能用Mode值處理的唯一語法。 – Tod