не показывать переход UWP при загрузке

#windows-runtime #uwp #winrt-xaml

#windows-среда выполнения #uwp #winrt-xaml

Вопрос:

Я использую переходы в UWP / WinRT, чтобы следовать быстрому и гибкому языку проектирования пользовательского интерфейса. Например, у меня есть StackPanels, которые определяют такие переходы:

     <StackPanel Orientation="Horizontal">
        <StackPanel.ChildrenTransitions>
            <TransitionCollection>
                <EntranceThemeTransition></EntranceThemeTransition>
            </TransitionCollection>
        </StackPanel.ChildrenTransitions>
    </StackPanel>
  

Это работает нормально, но анимация, установленная в ChildrenTransition, отображается при первом заполнении StackPanel и при добавлении новых элементов. Я хочу отображать его только при добавлении нового элемента. Есть ли простой способ отключить анимацию? Я уже думал о создании присоединенного свойства, которое обтекает ItemsSource и удаляет содержимое ChildrenTransition, а затем сбрасывает его, но это не кажется слишком элегантным.

Ответ №1:

Есть ли простой способ отключить анимацию?

В коде есть простой способ сделать это, просто добавьте это Transition в Loaded случае этого StackPanel :

 <StackPanel x:Name="rootStackPanel" Loaded="rootStackPanel_Loaded">
    <!--<StackPanel.ChildrenTransitions>
        <TransitionCollection>
            <EntranceThemeTransition FromVerticalOffset="600" x:Name="enttst">
            </EntranceThemeTransition>
        </TransitionCollection>
    </StackPanel.ChildrenTransitions>-->

    <TextBlock Text="11111" FontSize="30" />

    <TextBlock Text="2222" FontSize="20" Margin="0,5" />

    <Button Content="add new textblock" Click="Button_Click_1" />
</StackPanel>
  

в коде за:

 private void rootStackPanel_Loaded(object sender, RoutedEventArgs e)
{
    TransitionCollection trs = new TransitionCollection();
    EntranceThemeTransition enttrs = new EntranceThemeTransition()
    {
        FromVerticalOffset = 600
    };
    trs.Add(enttrs);
    rootStackPanel.ChildrenTransitions = trs;
}
  

Возможно, вы также считаете этот метод не совсем элегантным, но, похоже, нет способа сделать это в чистом xaml.

Ответ №2:

Основываясь на ответе Грейс Фенг, я написал решение в стиле XAML, создав прикрепленное свойство:

 public class PanelExtensions : DependencyObject
{
    public static readonly DependencyProperty ChildrenTransitionsAfterLoadProperty =
        DependencyProperty.Register("ChildrenTransitionsAfterLoad", typeof(TransitionCollection),
            typeof(Panel), new PropertyMetadata(new TransitionCollection()));

    public static TransitionCollection GetChildrenTransitionsAfterLoad(DependencyObject d)
    {
        return (TransitionCollection)d.GetValue(ChildrenTransitionsAfterLoadProperty);
    }

    public static void SetChildrenTransitionsAfterLoad(DependencyObject d, TransitionCollection collection)
    {
        d.SetValue(ChildrenTransitionsAfterLoadProperty, collection);
        var panel = d as Panel;
        if (panel == null)
            return;
        panel.Loaded  = PanelOnLoaded;
    }

    private static void PanelOnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        (sender as Panel).ChildrenTransitions = GetChildrenTransitionsAfterLoad(sender as DependencyObject);
    }
}
  

Его можно использовать следующим образом:

 <StackPanel Orientation="Horizontal">
    <yourNamespace:PanelExtensions.ChildrenTransitionsAfterLoad>
        <TransitionCollection>
            <EntranceThemeTransition></EntranceThemeTransition>
        </TransitionCollection>
    </yourNamespace:PanelExtensions.ChildrenTransitionsAfterLoad>
</StackPanel>