Как определить, завершен ли RepositionThemeTransition или принудительно активировать RepositionThemeTransition - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть ListView, где весь ListView будет скользить влево и перезагрузить Listivew, если пользователь щелкнет элемент.Проблема заключается в том, что если я выполню обе эти задачи в обработчике события нажатия кнопки, переход не будет отображаться до завершения метода.И, таким образом, переход ListView даже не будет анимирован, так как я сразу же перезагружаю ItemSources.Мне нужно что-то, что может ожидать перехода ListView, а затем перезагружает listview или заставляет ListView активировать его переход.

XAML:

       <ListView
            x:Name="DocumentListView"
            IsItemClickEnabled="True"
            ItemClick="FileClicked"
            ItemsSource="{x:Bind Files, Mode=OneWay}"
            Loading="DocumentListView_Loading">
            <ListView.Transitions>
                <TransitionCollection>
                    <RepositionThemeTransition />
                </TransitionCollection>
            </ListView.Transitions>
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:DocumentItem">
                    <local:DocumentsListRow />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

C #:

private void FileClicked(object sender, ItemClickEventArgs e)
{
    DocumentListView.Margin = new Thickness(-500, 0, 500, 0);
    DocumentListViewHeader.Margin = new Thickness(-500, 0, 500, 0);
    parent = Utility.Utility.FindParent<Documents>(this);

    //this line resets the ItemSource of ListView, if I include this the transition won't work
    parent.reloadList(0);
}

1 Ответ

0 голосов
/ 26 февраля 2019

Для вас есть два варианта.

  1. Вы можете добавить небольшую задержку после изменения позиции ListView.См. Следующий пример кода:

    <Button Content="Remove Rectangle" Click="RemoveButton_Click"/>
    <ItemsControl Grid.Row="1" x:Name="rectangleItems">
        <ItemsControl.Transitions>
            <TransitionCollection>
                <RepositionThemeTransition></RepositionThemeTransition>
            </TransitionCollection>
        </ItemsControl.Transitions>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapGrid Height="400"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.Items>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
            <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        </ItemsControl.Items>
    </ItemsControl>
    
    private async void RemoveButton_Click(object sender, RoutedEventArgs e)
    {
        rectangleItems.Margin = new Thickness(100);
        await Task.Delay(1000);
        rectangleItems.Items.Clear();
        for (int i = 0; i < 9; i++)
        {
            rectangleItems.Items.Add(new Rectangle() { Fill = new SolidColorBrush(Colors.Yellow), Width = 100, Height = 100, Margin = new Thickness(10) });
        }
    }

Вы можете использовать RepositionThemeAnimation вместо RepositionThemeTransition.В RepositionThemeAnimation есть событие Завершено .Вы можете перезагрузить список в обработчике завершенных событий.

<Grid>
<Grid.Resources>
    <Storyboard x:Name="PositionStoryboard">
        <RepositionThemeAnimation Storyboard.TargetName="rectangleItems" Duration="0:0:1" FromHorizontalOffset="-400" Completed="RepositionThemeAnimation_Completed"/>
    </Storyboard>
</Grid.Resources>
<Button Content="Remove Rectangle" Click="RemoveButton_Click"/>
<ItemsControl Grid.Row="1" x:Name="rectangleItems">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapGrid Height="400"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Items>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
        <Rectangle Fill="Red" Width="100" Height="100" Margin="10"/>
    </ItemsControl.Items>
</ItemsControl>
</Grid>
    private  void RemoveButton_Click(object sender, RoutedEventArgs e)
    {
        PositionStoryboard.Begin();
    }

    private void RepositionThemeAnimation_Completed(object sender, object e)
    {
        rectangleItems.Items.Clear();
        for (int i = 0; i < 9; i++)
        {
            rectangleItems.Items.Add(new Rectangle() { Fill = new SolidColorBrush(Colors.Yellow), Width = 100, Height = 100, Margin = new Thickness(10) });
        }
    }
...