2012-01-12 3 views
2

ゴール

私はDataGrid内のテキストが含まれているWPFアプリケーションを持っています。 テキストを各セル内で折り返したい。 また、各列にMinWidthを設定する必要がある場合は、ScrollViewerにhorizo​​natlスクロールバーを作成する必要があります。 セルのいずれか、またはDataGrid自体に水平スクロールバーを表示することは決してありません。 ユーザーがウィンドウのサイズを変更した場合、テキストの折り返しに対応するために行が拡大または縮小される必要がありますが、列が読み込めなくなるほど薄くなってはいけません。それはScrollViewerの中にあるので、TextWrapping

問題

、テキストは折り返されません。 私は、このサンプルを変更してテキストを折り返す方法があると知っていますが、上記のように、それが必要な方法で正確に動作するようにはできません。あなたはscrollViewr(DataGrid内にすでに存在)が表示されるように...あなたは、データグリッドのMaxWidthプロパティ/ Maxheighjtを設定する必要があります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

これは列1が最低10長さと を育成します。これは、その列2意志を意味することを意味し、「*」

<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> 

ように列幅を設定してみてくださいこれは、列3が最低50の長さも、あなたは*は割合(.NUMBER *)または長さ(番号*)

2

... ...また、あなたはスペースが消費された後TextBlockがラップします

   <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> 

...私はElementStyleでこれを試していないが、それも...すべての幅で動作するはずのセルのテキストをラップするwnat場合デモ用の高さだけを使用してください必要に応じて、NW値は... :)

1

私のソリューションタックを使用してリサイズして遊ぶことができます

を育成することを意味し、最低10長さと 成長Headerテキストを折り返して表示したい場合のシナリオを示します。列の幅も制御します。私は作り付けの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。このタイプを使用すると、HeaderTemplateまたはCellTemplateのいずれかを次のように指定できます。

<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> 
関連する問題