2016-05-26 28 views
1

我有ListView.ItemTemplate一個ListView這樣WPF XAML ListView控件 - 讓TextBlock的文字環繞

<ListView 
    x:Name="myList" 
    BorderBrush="Transparent" 
    ItemsSource="{Binding MyItems}" 
    SelectedIndex="0" 
    ScrollViewer.CanContentScroll="True" 
    ScrollViewer.VerticalScrollBarVisibility="Auto"> 

    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Padding" Value="0" /> 
     </Style> 
    </ListView.ItemContainerStyle> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid Margin="5,5,5,5"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="200"/> <--THIS WILL FORCE WRAPPING 
        <ColumnDefinition Width="50"/> 
       </Grid.ColumnDefinitions> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 

        <TextBlock Text="{Binding FilePath}" 
           Grid.Row="0" Margin="3,3,3,3" 
           Style="{StaticResource MyFilePathTextLabel}" 
           TextWrapping="WrapWithOverflow"/> <-- THIS WILL NOT WRAP TEXT 
        <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="3,3,3,3"> 
         <TextBlock Text="Lab location: "/> 
         <TextBlock Text="{Binding LabLocation}" 
            Style="{StaticResource MyLabLocationTextLabel}"/> 
        </StackPanel> 
        ... 
        ... 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    ... 
    ... 
</ListView> 

這將顯示ListView的項目是這樣的:

---------------------------------- 
C:/samples/folderA/myfile1.txt  <-- NO WRAP AS IT FITS 
Lab location: Chemistry Lab 301 
---------------------------------- 
C:/samples/folderA/folderB/fold 
erC/folderD/folderE/folderF/myf 
ile2.txt       <-- WRAP SINCE NOT FITTING 
Lab location: Chemistry Lab 301 
---------------------------------- 
C:/samples/folderA/folderB/myfi 
le3.txt       <-- WRAP SINCE NOT FITTING 
Lab location: Chemistry Lab 301 
---------------------------------- 
C:/samples/folderA/folderB/fold 
erC/folderD/folderE/folderF/fol 
derG/folderH/folderI/folderJ/fo 
lderK/myfile4.txt     <-- WRAP SINCE NOT FITTING 
Lab location: Chemistry Lab 301 
---------------------------------- 
C:/samples/myfile5.txt    <-- NO WRAP AS IT FITS 
Lab location: Chemistry Lab 301 
---------------------------------- 

以上,每件商品顯示的文件位置作爲包裝,如果它不適合ListView的寬度。

UPDATE: 更新XAML

更新2: 格容器的列寬度設置爲硬編碼值將迫使包裹(參見上文註釋行)。但由於表單的大小可調整,網格和ListView也可以調整大小。因此,我無法硬編碼寬度。 它需要根據表單的當前大小進行換行。

+1

我無法理解你的要求。 *你想*文本包裝?因爲我測試了你的代碼,並且文本按照預期分成了多行。 –

+0

@ MK87我已更新XAML。這在我的情況下不起作用。非常感謝 – pixel

回答

5

設置ListView對象本身的HorizontalContentAlignement="Stretch",告訴它水平拉伸它的Content以適應可用空間,並將HorizontalScrollBarVisiblilty設置爲Disabled以確保禁用水平滾動。

<ListView x:Name="myList" ... 
      HorizontalContentAlignment="Stretch" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 

enter image description here

+0

你搖滾! ......就像你讀的文章一樣。這解決了這個問題。我只剩下一個問題,這裏描述http://stackoverflow.com/questions/37465077/wpf-xaml-listview-with-scrollbars?noredirect=1#comment62429367_37465077。你介意評論那個瑞秋嗎?非常感激。 – pixel

0

你可以嘗試有第一RowDefinition,如:中

<RowDefinition Height="Auto"/> 

代替

<RowDefinition Height="*"/> 

如果沒有成功,嘗試暫時移除

Style="{StaticResource MyFilePathTextLabel}" 

也。你沒有分享它的代碼,所以我認爲它可能會打破封裝。

+0

對不起,但那是行不通的。試了兩個建議。非常感謝 – pixel

1

如果使用Grid並設置爲<ColumnDefinition Width="*">,則儘可能地放大GridColumn以填充所有可用空間。之後只有,其他操作如包裝發生。

在這種情況下,GridColumn變得足夠大,可以在一行中包含所有文本。這就是文字不換行的原因:它不需要換行!它擁有所需的所有空間,以保持一條線路!

解決方案:將固定列寬設置爲200或100,或者嘗試更小的寬度,然後查看結果。在某些時候,文本必須包裹,並且有足夠薄的GridColumn

解彈性寬度:

你具有結合所述內Grid(所述一個與所述RowDefinitions)的Width到外Grid(所述一個與所述ColumnDefinitions)的ActualWidth

創建這樣的轉換器:

public class OuterGridToInnerGridWidthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((double)value)/2; 
    } 
} 

在這個例子中我假設內Grid具有外的Width一半。相反,如果你有GridWidth="*"的柱,並用一個固定的寬度的第二列 - 例如 - 50,轉換器可以是:

public class OuterGridToInnerGridWidthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((double)value) - 50; 
    } 
} 

製造此,該屬性添加到內Grid

Width="{Binding ActualWidth, 
    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, 
    Converter={StaticResource OuterGridToInnerGridWidthConverter}}" 

最後,設置HorizontalContentAlignment="Stretch"ListView

當您使窗口變小或變大時,此功能可用:TextBlock調整大小並正確換行。

+0

你是對的。我更新了上面的XAML並添加了評論。然而,我無法硬編碼寬度,因爲表單可以調整大小,並且相應地進行調整。這就是相對定位應該如何工作。所以,我不能使用硬編碼寬度。非常感謝 – pixel

+1

如果你離開'Width =「*」'並調整窗口的大小以使其更小,會發生什麼?文本是否包裝在某個點上?或者內容保持不變(可能是水平滾動條)? –

+1

不。如果我有寬度=「*」,則根本沒有包裝。水平滾動條顯示。 – pixel