当选择了WPF DataGrid设置文本换行

时间:2018-08-07 16:05:33

标签: c# wpf

我正在尝试使用this answer中所示的相同技术,在选择WPF DataGrid行时将TextBlock的TextWrapping属性设置为Wrap

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <Trigger Property="DataGridCell.IsSelected" Value="True">
                <Setter Property="Background" Value="LightBlue" />
                <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
            </Trigger>                        
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

背景颜色变化很好,但是包装属性似乎没有设置。

我也尝试过创建TextBlock样式,但是在访问IsSelected属性时还有其他问题。我感觉到我应该在这里进行一些小的更改。

编辑:尽管我一直在寻找一个更全局的选项,尤其是当列可能自动生成时,我似乎还是可以沿用每个DataGridTextColumn的样式。

1 个答案:

答案 0 :(得分:2)

  

我也尝试过创建TextBlock样式,但是在访问IsSelected属性时遇到了其他问题。

ElementStyle应该有效:

<DataGridTextColumn Binding="{Binding Name}" Width="100">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridCell}}" Value="True">
                    <Setter Property="TextWrapping" Value="Wrap" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

如果要自动生成列,则可以将ElementStyle定义为资源并处理AutoGeneratingColumn事件:

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataGrid dataGrid = (DataGrid)sender;
    DataGridTextColumn column = e.Column as DataGridTextColumn;
    if (column != null)
    {
        column.ElementStyle = dataGrid.Resources["ElementStyle"] as Style;
    }
}

XAML:

<DataGrid x:Name="dataGrid" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn">
    <DataGrid.Resources>
        <Style x:Key="ElementStyle" TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridCell}}" Value="True">
                    <Setter Property="TextWrapping" Value="Wrap" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
</DataGrid>