TextWrapping внутри DataGrid - PullRequest
       0

TextWrapping внутри DataGrid

2 голосов
/ 12 января 2012

Цель

У меня есть приложение WPF, содержащее текст внутри DataGrid. Я хочу, чтобы текст был внутри каждой ячейки. Я также хочу установить MinWidth для каждого столбца и, если это необходимо, ScrollViewer должен создать полосу прокрутки horizonatl. Я никогда не хочу, чтобы горизонтальная полоса прокрутки отображалась для любой из ячеек или самой DataGrid. Если пользователь изменяет размер окна, строки должны увеличиваться или уменьшаться для размещения переноса текста, но это не должно позволять полям становиться настолько тонкими, что они больше не будут читаться.

Проблема

В настоящее время текст не переносится, потому что он находится в средстве просмотра прокрутки. Я знаю различные способы, которыми я могу изменить этот образец, чтобы получить текст для переноса, но я не могу заставить его действовать именно так, как я хочу, как упоминалось выше.

Упрощенный 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>

Ответы [ 3 ]

4 голосов
/ 12 января 2012

Попробуйте установить ширину столбцов на «*»

 <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 и будет расти

Вы можете поиграть с * изменением размера, используя проценты (.Number *) или длины (Number *)

2 голосов
/ 12 января 2012

Вам не нужно помещать dataGrid в scrollViewer ... вы должны установить MAXWidth / Maxheighjt DataGrid так, чтобы scrollViewr (уже присутствующий в dataGrid) появился ...... Также, если вы хотите Wrap to Wrap Текст ячейки

                <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, но должно работать и с этим тоже. Вся ширина и высота только для демонстрации, вы должны использовать ваши значения onw по мере необходимости ...:)

1 голос
/ 28 ноября 2013

Мое решение подходит для сценария, когда нужно иметь обтекание текстом 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>
...