使用模板将TextWrapping设置为Wrap for all Cells

时间:2016-07-04 19:16:22

标签: c# wpf datagrid resourcedictionary textwrapping

所以,我有下一个问题: 我正在设置一个自定义表(从DB中填充),其中将包含单元格的内容。 我能够正确设置视图。代码是:

<Grid Style="{StaticResource FormBackground}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="20" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="20" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="15" />
        <RowDefinition Height="*" />
        <RowDefinition Height="40" />
        <RowDefinition Height="10" />
    </Grid.RowDefinitions>

    <Grid Grid.Column="1" Grid.Row="1">
        <Border Style="{StaticResource DGBorder}">
            <DataGrid x:Name="usuariosGrid" 
                  AutoGenerateColumns="False" 
                  CanUserAddRows="False"
                  Grid.Row="0" 
                  Style="{StaticResource Table}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="ID" Width="40" Binding="{Binding Id}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Nombre" Width="*" Binding="{Binding Nombre}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Apellido Paterno" Width="*" Binding="{Binding ApellidoPaterno}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Apellido Materno" Width="*" Binding="{Binding ApellidoMaterno}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="CorreoElectronico" Width="*" Binding="{Binding CorreoElectronico}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Border>
    </Grid>

效果很好,但非常难看,因为我必须设置TextBox - &gt; TextWrapping - &gt;为每列包裹自定义。同样 - 该项目包含多个DataGrids。所以可以肯定 - 我想将它全部打包到ResourceDictionary中,即:

<Style x:Key="Table" TargetType="DataGrid">
    <Setter Property="Foreground" Value="{StaticResource WhiteBrush}" />
    <Setter Property="RowBackground" Value="Transparent"/>
    <Setter Property="AlternatingRowBackground" Value="{StaticResource DarkBlueFadedBrush}" />
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="ColumnHeaderStyle" Value="{StaticResource DGColumnHeader}" />
    <Setter Property="RowStyle" Value="{StaticResource SelectedRow}"/>
    <Setter Property="GridLinesVisibility" Value="None" />
    <Setter Property="RowHeaderWidth" Value="0" />
    <Setter Property="BorderBrush" Value="{StaticResource LightBlueBrush}" />
</Style>

此时开始有趣:DataGridTextColumn不支持将其设置为样式。

嗯 - 意志在哪里,有办法。网络上的一位同志说,并建议使用后面的代码。这是公平的。但我相信,应该划分这种类型的改进(并且因为有必要将代码添加回每个包含表单的查看者)。

任何建议,工作指示等都将不胜感激。

2 个答案:

答案 0 :(得分:1)

在这种特殊情况下,这对我有用。 风格:

<Style TargetType="{x:Type TextBlock}" x:Key="WrapText">
    <Setter Property="TextWrapping" Value="Wrap"/>
</Style>

用法:

<DataGrid.Columns>
    <DataGridTextColumn Header="ID" Width="40" Binding="{Binding Id}" IsReadOnly="True" ElementStyle="{StaticResource WrapText}" />

因此,整个技巧是在描述DataGridTextColumn时使用ElementStyle属性定义样式。希望它会有所帮助。

答案 1 :(得分:0)

  1. 如果您希望所有DataGrids中的多项内容保持通用。从DataGrid派生一个新班级,从而创建新的Control

  2. 您可以随时执行此操作:<DataGridTextColumn ElementStyle="{StaticResource tbKey}" Binding="{Binding Name}"/>

      <Style TargetType="TextBlock" x:Key="tbKey">
           <Setter Property="TextWrapping" Value="Wrap" />
      </Style>