【问题标题】:How do you change WPF DataGrid cell background while editing the cell?如何在编辑单元格时更改 WPF DataGrid 单元格背景?
【发布时间】:2013-02-09 04:42:18
【问题描述】:

以下是选择单元格时如何设置背景的示例,但是当我实际单击单元格内部进行编辑时,颜色会发生变化。编辑单元格时是否有触发属性?我希望背景不要改变。

<DataGrid Name="DG1" ItemsSource="{Binding}" SelectionUnit="Cell" >
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell" >
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="SeaGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

回答我自己的问题,看起来单元格背景颜色基于SystemColors.WindowBrushKey。像&lt;SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="Red" /&gt; 这样覆盖该资源就可以了。 `

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    您可以为IsEditing 状态在现有样式中添加另一个触发器。然后您可以在触发器内部为DataGridCell 设置ControlTemplate

    <Trigger Property="IsEditing" Value="True">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridCell">
                    <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text, Mode=TwoWay, UpdateSourceTrigger=Default}"
                             HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Padding="0" BorderThickness="0" Background="SeaGreen"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
    

    【讨论】:

    • 不错的解决方案,但有一个问题:文本框不会自动聚焦。为了自动关注文本框,在文本框的声明中添加以下属性:FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
    • 工作正常,但前提是所有列都是 DataGridTextColumn 类型。如果有其他类型的列,比如带有 CheckBox 的 DataGrigTemplateColumn,那么在单击单元格后,它将变为 TextBox 而不是 CheckBox。有什么建议如何区分触发器中的列类型?
    【解决方案2】:

    这适用于 DataGridTemplateColumn 以及其他类型,如 DataGridTextColumn、DataGridCheckboxColumn 等:

    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Padding" Value="0" />
        <Setter Property="Margin" Value="0" />
        <Setter Property="BorderBrush" Value="Transparent" />
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border x:Name="CellBorder"
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            Background="{TemplateBinding Background}"
                            SnapsToDevicePixels="True">
                                <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>                                            
                        <Trigger Property="IsEditing" Value="True">
                            <Setter TargetName="CellBorder" Property="BorderBrush" Value="Green" />
                            <Setter TargetName="CellBorder" Property="Background" Value="yellow" />
                            <Setter TargetName="CellBorder" Property="BorderThickness" Value="1" />
                            <Setter Property="Foreground" Value="Black" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
    </Style>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2011-04-03
      • 2018-09-26
      • 2013-01-14
      • 2015-08-30
      • 1970-01-01
      • 2012-12-04
      • 2020-12-25
      相关资源
      最近更新 更多