如果满足某个数据条件,如何为DataGrid单元格背景设置动画?

Sat*_*ala 2 wpf animation datagrid

我有一个从数据库填充的WPF DataGrid.有一个细胞给我一个计数.如果它的值大于0,我想为该单元格添加闪烁的背景颜色.感谢您帮助解决我的问题.

kev*_*v22 12

创建一个转换器,检查单元格是否包含大于0的数字:

namespace MyApp
{
    public class GreaterThanZeroConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            int cellValue;
            return Int32.TryParse((string)value, out cellValue) && cellValue > 0;
        }

        public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在xaml中包含转换器命名空间.替换MyApp为转换器的命名空间:

xmlns:myApp="clr-namespace:MyApp"
Run Code Online (Sandbox Code Playgroud)

您的网格必须看起来像这样.我绑定的对象有2个属性:Col1和Col2.如果Col1的值大于0,则该单元格将闪烁红色.

<DataGrid ItemsSource="{Binding List}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <myApp:GreaterThanZeroConverter 
            x:Key="GreaterThanZeroConverter">
        </myApp:GreaterThanZeroConverter>
        <Style TargetType="DataGridCell" x:Key="FlashStyle">
            <Style.Triggers>
                <DataTrigger 
                    Binding="{Binding Col1, 
                    Converter={StaticResource GreaterThanZeroConverter}}" 
                    Value="True" >
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard 
                                x:Name="Blink" 
                                AutoReverse="True" 
                                RepeatBehavior="Forever">
                                <ColorAnimationUsingKeyFrames 
                                    BeginTime="00:00:00"
                                    Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)">
                                    <EasingColorKeyFrame 
                                        KeyTime="00:00:01" 
                                        Value="Red" />
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn 
            Binding="{Binding Col1}" 
            CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
        <DataGridTextColumn 
            Binding="{Binding Col2}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

编辑

如果必须根据它们包含的内容使多个列中的单元格闪烁,则可以更改

<DataTrigger 
    Binding="{Binding Col1, 
    Converter={StaticResource GreaterThanZeroConverter}}" 
    Value="True" >
  ...
Run Code Online (Sandbox Code Playgroud)

<DataTrigger 
    Binding="{Binding 
        Content.Text,
        RelativeSource={RelativeSource Self},
        Converter={StaticResource GreaterThanZeroConverter}}" 
    Value="True" >
Run Code Online (Sandbox Code Playgroud)

并为要闪烁到FlashStyle的每个列设置CellStyle:

<DataGrid.Columns>
    <DataGridTextColumn 
        Binding="{Binding Col1}" 
        CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
    <DataGridTextColumn 
        Binding="{Binding Col2}"
        CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

请注意,这可能只适用于DataGridTextColumns.如果您正在使用DataGridTemplateColumns,那将会更棘手.