如何使EntranceThemeTransition适用于自定义面板&的ItemsSource?

时间:2015-07-26 08:46:20

标签: c# xaml windows-phone winrt-xaml windows-10

我无法让EntranceThemeTransition作为ItemsPanelTemplate在自定义面板上工作。参见:

最简单的代码:

public List<int> MyListExample = new List<int>() {0, 1, 2, 3, 4, 5};

最简单的XAML:

<ListView Width="120" ItemsSource="{x:Bind MyListExample}">
    <ListView.ItemContainerTransitions>
        <TransitionCollection>
            <EntranceThemeTransition FromVerticalOffset="200" IsStaggeringEnabled="True"/>
        </TransitionCollection>
    </ListView.ItemContainerTransitions>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <!--EntranceThemeTransition WORKS-->
            <ItemsWrapGrid/>

            <!--EntranceThemeTransition does NOT work-->
            <!--<StackPanel/>-->

            <!--EntranceThemeTransition does NOT work. goal: make this work-->
            <!--<local:FluidPanel/>-->
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

知道如何制作动画吗?

PS:我在Loaded事件上放了一个Debug.WriteLine,它被调用了两次,我不明白为什么。这可能会导致问题,因为此动画仅触发一次。可能在添加ItemsSource之前触发。

PS2:只有在使用ItemsSource时才会发生。如果我直接在ListView XAML上添加元素,它会显示动画。

(也在MSDN

1 个答案:

答案 0 :(得分:1)

这真是一个错误。绑定将一起应用或仅在动画之后应用。因为EntranceThemeTransition只发生一次,它认为它已经执行并禁用它。

这是我目前正在使用的解决方法:

C#:

public ObservableCollection<int> items { get; set; } = new ObservableCollection<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

private async void MyListView_Loaded(object sender, RoutedEventArgs e)
{
    foreach (var item in items)
        MyListView.Items.Add(item);

    await Task.Delay(1000); //wait for animation
    MyListView.SetBinding(ItemsControl.ItemsSourceProperty, new Binding() { Source = this, Path = new PropertyPath("items"), Mode = BindingMode.TwoWay });
}


XAML:

<ListView x:Name="MyListView" Loaded="MyListView_Loaded">
    <ListView.ItemContainerTransitions>
        <TransitionCollection>
            <EntranceThemeTransition FromHorizontalOffset="0" FromVerticalOffset="2000" IsStaggeringEnabled="True"/>
        </TransitionCollection>
    </ListView.ItemContainerTransitions>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

感谢Franklin Chen对MSDN forum关于在代码背后添加项目的见解。