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

当ListView单元格中的值更改时闪烁颜色

  •  2
  • Ray  · 技术社区  · 14 年前

    我有一个列表视图(如下所示)。我希望单元格在显示的值改变时闪烁颜色(理想情况下,一种颜色表示增加,一种颜色表示减少)。

    我知道如何为颜色编写动画(如下),我很确定我需要使用一个单元格模板,这样我就可以将触发器连接到样式以启动动画。我只是不确定把扳机挂在什么地方最好。

    我希望我能参与到财产变更事件,但我不知道怎么做。

        <ListView ItemsSource="{Binding MyListItems}">
            <ListView.View>
                <GridView>                
                    <GridViewColumn Header="Value1" Width="50" CellTemplate="{StaticResource Value1CellTemplate}" />
                    <GridViewColumn Header="Value2" Width="50" DisplayMemberBinding="{Binding Value2}" />
                </GridView>
            </ListView.View>
        </ListView>
    

    单元格模板和颜色动画:

        <DataTemplate x:Key="Value1CellTemplate">
            <TextBlock Text="{Binding LowerBound}" HorizontalAlignment="Right" />
        </DataTemplate>
    
        <Storyboard x:Key="IncreaseValueColourAnimation" Duration="0:0:2">
            <ColorAnimationUsingKeyFrames>
                <ColorAnimationUsingKeyFrames.KeyFrames>
                    <LinearColorKeyFrame Value="Red" KeyTime="0:0:0.1" />
                    <LinearColorKeyFrame Value="Transparent" KeyTime="0:0:2" />
                </ColorAnimationUsingKeyFrames.KeyFrames>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Ben Von Handorf    14 年前

    我相信你在找 TargetUpdated 框架工作元素外的事件。

    在目标值更改时发生 对于任何绑定到此的属性 元素。

    然后,您应该能够使用EventTrigger来运行动画。

        2
  •  1
  •   Dabblernl    14 年前

    这是我在有限的时间内能想到的最好的办法。如果需要的话,我明天可以帮你做进一步的工作。注意,我使用了CellTemplate的一个文本框,这使我能够使用TextChanged事件来触发着色。我不能让你的关键帧动画工作,所以我使用了着色动画。祝你好运!

    <Window x:Class="CellFlashSpike.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <Window.Resources>
            <Storyboard x:Key="IncreaseValueColourAnimation"
                        Duration="0:0:2"
                        AutoReverse="True">
                <ColorAnimation Storyboard.TargetProperty="(TextBox.Foreground).(SolidColorBrush.Color)"
                                To="Red"/>
            </Storyboard>
            <DataTemplate x:Key="FlashTemplate">
                <TextBox Width="50" Text="{Binding Path=.}">
                    <TextBox.Style>
                        <Style>
                            <Style.Triggers>
                                <EventTrigger RoutedEvent="TextBox.TextChanged">
                                    <EventTrigger.Actions>
                                        <BeginStoryboard>
                                            <StaticResource ResourceKey="IncreaseValueColourAnimation"/>
                                        </BeginStoryboard>
                                    </EventTrigger.Actions>
                                </EventTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListView ItemsSource="{Binding Numbers}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn CellTemplate="{StaticResource FlashTemplate}"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </Window>
    
    namespace CellFlashSpike
    {
        public partial class Window1 : Window
        {
            public List<string> Numbers { get; set; }
    
            public Window1()
            {
                Numbers = new List<string> { "3", "4" };
                InitializeComponent();
                DataContext = this;
            }
        }
    }