#.net #wpf #xaml #storyboard #datatrigger
#.net #wpf #xaml #раскадровка #datatrigger
Вопрос:
одно из приложений моей компании отображает всплывающие окна с помощью элемента управления контентом, расположенного по центру экрана, который скрыт до тех пор, пока он не понадобится, и прямоугольника с радиальным градиентом за ним, чтобы блокировать остальную часть пользовательского интерфейса, плюс это выглядит красиво. Я пытаюсь добавить анимацию, когда отображаются как прямоугольник, так и всплывающее окно, а не просто появляются. Анимация ввода работает хорошо, но анимация выхода никогда не вызывается, когда мое всплывающее окно закрыто, и эффекты анимации ввода остаются постоянными.
Мой XAML выглядит следующим образом:
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Panel.ZIndex="999" DataContext="{Binding Source={x:Static popup:PopUpService.Instance}}" IsHitTestVisible="{Binding IsPopUpVisible}" Opacity="0">
<Rectangle Fill="{DynamicResource RadialBlackToBlack}" />
<ItemsControl Focusable="False" ItemsSource="{Binding PopUps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding IsPopUpVisible, Source={x:Static popup:PopUpService.Instance}}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="100" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
Что я делаю не так?
Спасибо.
Ответ №1:
Непрозрачность должна анимироваться на 1
not 100
, это вызывает проблему. (Анимация от 100
to 1
не видна, а последний бит от 1
to 0
занимает мало времени анимации)
Возможно, вы также хотите избавиться от избыточности:
- Не устанавливайте свойства дважды или без необходимости, отбросьте
Duration
наStoryboards
и всеHoldEnd
s, которые используются по умолчанию. - Почему
AutoReverse
в первом SB есть an?
Комментарии:
1. Но когда IsPopUpVisible становится ложным, условия запуска больше не выполняются, и анимация выхода должна срабатывать, не так ли? IsPopUpVisible не делает всплывающие окна невидимыми сразу, я намерен сделать это с помощью анимации выхода, установив непрозрачность в 0.
2. @SoManyGoblins: Отредактировав свой ответ, я заметил некоторую серьезную задержку в вашем коде, потому что анимация переходит от
100
к0
и1
видна только разница (допустимый диапазон равен0
1`), но в конечном итоге это сработало, сделав сетку невидимой.