【问题标题】:No text is visible when highlighting a cell in WPF datagrid突出显示 WPF 数据网格中的单元格时没有文本可见
【发布时间】:2023-04-25 04:06:01
【问题描述】:

作为一个完整的 WPF 新手,我正在编写一个快速而肮脏的 WPF 应用程序。我有一个简单的数据网格:

<DataGrid ItemsSource="{Binding Path=BetterFoods}" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="True" Loaded="DataGrid_Loaded">
    <DataGrid.Resources>
        <local:ValueColorConverter x:Key="colorconverter"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF0033"/>
    </DataGrid.Resources>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource colorconverter}}"/>
        </Style>
   </DataGrid.CellStyle>
</DataGrid>

数据网格由简单的IValueConverter 着色,这与教程和 Stack Overflow 中的大量示例几乎相同:

class ValueColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return Brushes.Beige;
        }
        else if (value is string)
        {
            string str = ((string)value).Trim();
            if (str.Equals(string.Empty))
            {
                return Brushes.Beige;
            }
            else if (str.Equals("0"))
            {
                return Brushes.LightYellow;
            }
        }

        return System.Windows.DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

IValueConverter 的工作方式与它应有的完全一样,但它引入了一个奇怪的副作用:选择一行会使 其单元格中的所有值消失。这些值仍然存在,因为更改选择或双击单元格会使它们再次可见(参见下面的 .gif)。

这显然是不幸的,因为人们通常会突出显示一行以仔细查看其数据。

是什么导致了这种行为,我该如何解决?

【问题讨论】:

    标签: c# wpf datagrid wpfdatagrid


    【解决方案1】:

    添加一个资源 (SystemColors.HighlightTextBrushKey) 将文本画笔更改为更暗的颜色,以便您可以实际看到文本:

    <DataGrid ItemsSource="{Binding Path=BetterFoods}" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="True">
        <DataGrid.Resources>
            <local:ValueColorConverter x:Key="colorconverter"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF0033"/>
            <!-- ADDED: -->
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
        </DataGrid.Resources>
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource colorconverter}}"/>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>
    

    【讨论】: