将动画绑定到XAML中的ListViewItem

6

我想为新创建的ListViewItem分配动画。比如淡入或淡出。 我有以下XAML代码:

<ListView Height="320" HorizontalAlignment="Left" Margin="630,0,0,0" Name="listView1" VerticalAlignment="Top" Width="222" ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Name="mainGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.Resources>

                </Grid.Resources>
                <Image Name="img" Source="{Binding AvatarSource}" Width="32" Margin="8"></Image>
                <Image Source="{Binding IconSource}" Width="16" Margin="0,-28,32,0"></Image>
                <TextBlock Grid.Column="1" Margin="0,8,0,0" TextWrapping="Wrap">
                    <Run Text="{Binding Name}" FontWeight="Bold"></Run>
                    <LineBreak/>
                    <Run Text="{Binding StatusText}"></Run>
                </TextBlock>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

有没有类似于jQuery中的方法可以访问任何东西:$('#listViewItemId').fadeIn();

我能否将listView1.ItemsSource绑定到某个可访问的表单中,以便我可以看到其中所有的控件并进行操作?

如果使用ItemTemplate不可能实现,我也不想在C#中手动完成。

我是XAML的新手,并找不到任何好的资源以合适的方式学习XAML和C#。

1个回答

6

以下是最简单的代码和XAML,可以实现您想要的功能。从这里开始,让它在您自己的应用程序中运行。

<Window x:Class="ListviewItemLoadedSpike.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Storyboard x:Key="FadeIn">
            <DoubleAnimation 
                Storyboard.TargetProperty="Opacity" 
                Duration="0:0:2" From="0" To="1"/>
        </Storyboard>
        <Style TargetType="Label" x:Key="FadingLabel">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <BeginStoryboard Storyboard="{StaticResource FadeIn}"/>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel>
        <ListBox ItemsSource="{Binding Data}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding Info}"
                           Style="{StaticResource FadingLabel}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>
        <Button Name="AddButton"
                Click="AddButton_Click">
            Add Item
        </Button>
    </StackPanel>
</Window>

using System.Collections.ObjectModel;
using System.Windows;

namespace ListviewItemLoadedSpike
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private int counter;
        public MainWindow()
        {
            InitializeComponent();
            Data=new ObservableCollection<Datum>();
            DataContext = this;
        }

        private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            counter++;
            Data.Add(new Datum(counter.ToString()));
        }

        public ObservableCollection<Datum> Data { get; set; }
    }

    public class Datum
    {
        public Datum(string info)
        {
            Info = info;
        }

        public string Info { get; set; }
    }
}

Good Luck!


非常感谢!就这么简单,很好。 - Daniel G
可能值得一提的是,在Silverlight中,Fluid UI行为可以为您完成这项工作。我相信在WPF中,Blend也会处理这个问题。Jesse Liberty在这里写了一篇很好的文章http://jesseliberty.com/2009/11/20/silverlight-4-fluid-ui/。 - EightyOne Unite
这是一个很好的例子。但我想一个接一个地按顺序动画化listviewitem。这里所有的项都是同时显示的。当向列表视图添加项目时,我如何实现淡入动画? - Sachin123
@Sachin123:当ListItems被加载(添加到ListBox的ItemsSource中)时,它们会进行动画处理。因此,只需逐个添加项目即可。 - Dabblernl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接