2012-01-12 17 views
2

目標

我有一個WPF應用程序,其中包含DataGrid中的文本。 我希望文本包裹在每個單元格內。 我也想爲每列設置一個MinWidth,如果必須,ScrollViewer應該創建horizo​​natl滾動條。 我從不想爲任何單元或DataGrid本身出現水平滾動條。 如果用戶調整窗口大小,行應該增大或縮小以適應文本環繞,但不應允許coulmns變得非常薄以至於不再可讀。DataGrid中的文本包圍

問題

眼下,文本不換,因爲它是在一個ScrollViewer中。 我知道不同的方式,我可以改變這個示例以獲得文本打包,但我不能讓它按我的意願行事,如上所述。

簡化XAML

<Window x:Class="SampleApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SampleApp" 
    Title="App" Height="350" Width="525"> 

    <Window.Resources> 
     <Style x:Key="WrappingTextBlock" TargetType="TextBlock"> 
      <Setter Property="TextWrapping" Value="Wrap"/> 
     </Style> 
     <Style x:Key="WrappingTextBox" TargetType="TextBox"> 
      <Setter Property="TextWrapping" Value="Wrap"/> 
     </Style> 
    </Window.Resources> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Stuff ... /> 

     <MoreStuff ... /> 

     <Border Grid.Row="1" Grid.Column="1"> 
      <ScrollViewer> 
       <StackPanel>  
        <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding AwesomeObject, Mode=TwoWay}" Margin="5" AutoGenerateColumns="False"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="#" Binding="{Binding Number, Mode=TwoWay}"/> 
          <DataGridTextColumn Header="Header" Binding="{Binding Data, Mode=TwoWay}"/> 
          <DataGridTextColumn MinWidth="50" Header="Long Text" Binding="{Binding SoMuchText, Mode=TwoWay}" ElementStyle="{StaticResource WrappingTextBlock}" EditingElementStyle="{StaticResource WrappingTextBox}"/> 
         </DataGrid.Columns> 
        </DataGrid> 
       </StackPanel> 
      </ScrollViewer> 
     </Border> 
    </Grid> 
</Window> 

回答

4

嘗試設定寬度的列的爲「*」

<Border Grid.Row="1" Grid.Column="1"> 
    <ScrollViewer> 
     <StackPanel> 
      <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding AwesomeObject, Mode=TwoWay}" Margin="5" AutoGenerateColumns="False"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Width="10*" Header="#" Binding="{Binding Number, Mode=TwoWay}"/> 
        <DataGridTextColumn Width="10*" Header="Header" Binding="{Binding Data, Mode=TwoWay}"/> 
        <DataGridTextColumn Width="50*" Header="Long Text" Binding="{Binding SoMuchText, Mode=TwoWay}" ElementStyle="{StaticResource WrappingTextBlock}" EditingElementStyle="{StaticResource WrappingTextBox}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </StackPanel> 
    </ScrollViewer> 
</Border> 

這意味着第1列將是最小10的長度和生長 這意味着,第2列將是最小10的長度和生長 這意味着第3欄將是最小50的長度和生長

可以與*調整大小使用百分比(。數*)或長度(數*)

2

你不需要把DataGrid內的ScrollViewer ...你應該設置DataGrid的MAXWidth/Maxheighjt使scrollViewr(已經存在的DataGrid中)會出現... ......另外,如果你wnat包裹格文本

   <WPFToolkit:DataGrid Name="programListDataGrid" 
            AutoGenerateColumns="False" 
            CanUserAddRows="False" 
            CanUserDeleteRows="False" 
            CanUserReorderColumns="False" 
            IsReadOnly="True" 
            ItemsSource="{Binding Path=MyList}" 
            RowStyle="{StaticResource ResourceKey=dataGridRowStyle}" 
            SelectedItem="{Binding Path=MyItem, 
                  Mode=TwoWay}" 
            SelectionMode="Single"> 
        <WPFToolkit:DataGrid.Columns> 
         <WPFToolkit:DataGridTextColumn MinWidth="100" 
                 MaxWidth="250" 
                 Binding="{Binding Path=ItemName}" 
                 Header="Item Name" /> 

         <WPFToolkit:DataGridTemplateColumn                Width="*" 
                  MinWidth="200" 
                  Header="ItemData1"> 
          <WPFToolkit:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding ApplicationPath}" 
               TextWrapping="Wrap" 
               ToolTip="{Binding ItemData1}" /> 
           </DataTemplate> 
          </WPFToolkit:DataGridTemplateColumn.CellTemplate> 
         </WPFToolkit:DataGridTemplateColumn> 
         <WPFToolkit:DataGridTemplateColumn                Width="*" 
                  MinWidth="200" 
                  Header="ItemData2"> 
          <WPFToolkit:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding StandardCLP}" 
               TextWrapping="Wrap" 
               ToolTip="{Binding ItemData2}" /> 
           </DataTemplate> 
          </WPFToolkit:DataGridTemplateColumn.CellTemplate> 
         </WPFToolkit:DataGridTemplateColumn> 
        </WPFToolkit:DataGrid.Columns> 
       </WPFToolkit:DataGrid> 

TextBlock將包裹的空間被消耗之後......我還沒有ElementStyle試過,但應與工作太..所有的寬度和高度只是爲了演示你應該使用你的o根據需要NW值... :)

1

我的溶液粘性玩當人們希望文本換行時可以避免這種情況 - 控制列的寬度應該如何。我用的是內置DataGridTextColumn,但提供了一個自定義HeaderTemplate在我控制文本的包裝:

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Axle Group No."/> <!-- this stays with defaults --> 
     <DataGridTextColumn Header="Axle Group Load Measured :(a)" MaxWidth="100" ><!-- NOTE: MaxWidth and template below --> 
      <DataGridTextColumn.HeaderTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}" TextWrapping="Wrap" /> 
       </DataTemplate> 
      </DataGridTextColumn.HeaderTemplate> 
     </DataGridTextColumn> 
     </DataGrid.Columns> 
</DataGrid> 

如果您想自定義文本換行的數據單元格太,那麼最好使用完全可定製列類型DataGridTemplateColumn。該類型允許您以類似於此的方式指定HeaderTemplateCellTemplate

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
     <DataGridTemplateColumn.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}" TextWrapping="Wrap" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.HeaderTemplate> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}" TextWrapping="Wrap" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>