TextWra中的TextWrapping

时间:2012-01-12 00:57:42

标签: c# wpf xaml wpfdatagrid

目标

我有一个WPF应用程序,其中包含DataGrid内的文本。 我希望文本包含在每个单元格中。 我还想为每列设置MinWidth,如果必须,ScrollViewer应该创建horizo​​natl滚动条。 我从不希望为任何单元格或DataGrid本身显示水平滚动条。 如果用户调整窗口大小,行应该增大或缩小以适应文本换行,但是它不应该让coulmns变得太薄以至于它们不再可读。

问题

现在,文本没有换行,因为它在滚动查看器中。 我知道可以通过不同的方式更改此示例以使文本换行,但如上所述,我无法让它按照我想要的方式行事。

简化的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 个答案:

答案 0 :(得分: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列将是最小长度并且不断增长 这意味着第2列将是最小长度并且不断增长 这意味着第3列将是最小长度为50且不断增长

您可以使用百分比(.Number *)或长度(数字*)来调整*大小调整

答案 1 :(得分:2)

你不需要将dataGrid放在一个scrollViewer中...你应该设置DataGrid的MAXWidth / Maxheighjt,这样就会出现scrollViewr(已经存在于dataGrid中)......如果你想要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值根据需要...... :)

答案 2 :(得分:1)

我的解决方案解决了当希望有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。该类型允许您以与此类似的方式指定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>