代码之家  ›  专栏  ›  技术社区  ›  Dan

WPF DataGrid选择时设置文本换行

  •  2
  • Dan  · 技术社区  · 6 年前

    我正在尝试设置WPF DataGrid row TextBlock的 TextWrapping 属性到 Wrap 选择该行时,使用与 this answer .

    <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 回复  |  直到 6 年前
        1
  •  2
  •   mm8    6 年前

    我也试着创造一个 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>
    

    如果要自动生成列,可以定义 元素样式 作为资源并处理 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>