#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>