DataTrigger не похоже на огонь
Я хочу создать источник данных, который заставит мою страницу мигать (от прозрачного до красного). Поэтому я создал DataTrigger, который прослушивает логический флаг в моей модели представления. Этот флаг должен указывать всякий раз, когда пользователю необходимо напомнить. В этом случае моя страница будет мигать от прозрачного до красного.
Я был почти уверен, что правильно реализовал триггер данных, но мое приложение ничего не делает - ни ошибки, ни мигания... Так что я, должно быть, что-то пропустил.
<Style x:Key="ReminderPage" TargetType="{x:Type ViewTemplates:TpApplicationBarView}" BasedOn="{StaticResource TpApplicationBarViewStyle}">
<Style.Triggers>
<!-- Reminder animation, when the time comes to remind the user -->
<DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard x:Name="Blink">
<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
AutoReverse="True"
From="Transparent"
To="Red"
Duration="0:0:1"
RepeatBehavior="Forever">
</ColorAnimation >
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
AutoReverse="False"
To="Transparent"
Duration="0:0:1">
</ColorAnimation >
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
Итак, что я сделал не так?
Обновление: я вижу следующее сообщение в окне вывода:
System.Windows.Media.Animation Warning: 6 : Unable to perform action because
the specified Storyboard was never applied to this object for interactive control.;
Action='Stop'; Storyboard='System.Windows.Media.Animation.Storyboard';
Storyboard.HashCode='61356140'; Storyboard.Type='System.Windows.Media.Animation.Storyboard';
TargetElement='System.Windows.Media.Animation.Storyboard'; TargetElement.HashCode='61356140';
TargetElement.Type='System.Windows.Media.Animation.Storyboard'
Обновление 2: После поиска в Google я узнал, что это проблема с потоком пользовательского интерфейса. Поэтому я звонил диспетчеру всякий раз, когда устанавливал привязанное свойство. Но даже с этим трюком нет цветной анимации. Но ошибка в окне вывода, похоже, исчезла. Итак, я ищу дальнейшие идеи о том, как исправить анимацию.
Обновление 3: кажется, общая проблема с установкой цвета фона страницы. Но это действительно странно. Страница помещается в NavigationFrame. Установка цвета фона рамки навигации изменит цвет приложения, но установка цвета фона страницы (даже без анимации) ничего не изменит.
2 ответа
Я нашел ошибку - или лучше две ошибки.
1.) Кажется невозможным изменить цвет фона страницы, помещенной в рамку навигации.
Итак, сначала нужно было перенести привязку и событие на сам MainWindow (класс окна wpf).
2.) Стиль, содержащий триггер данных, не работает. После поисков в поисках я нашел рабочее решение для того, что я ищу.
<Storyboard x:Key="RemindUser" >
<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
AutoReverse="True"
From="Transparent"
To="{StaticResource WinAccentBackgroundColor}"
Duration="0:0:1"
RepeatBehavior="Forever">
</ColorAnimation >
</Storyboard>
<Storyboard x:Key="StopRemindUser">
<ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
AutoReverse="True"
To="Transparent"
Duration="0:0:1">
</ColorAnimation >
</Storyboard>
<Style x:Key="ReminderWindow" TargetType="{x:Type Metro:SnappedTransparentWindow}" BasedOn="{StaticResource TransparentWindow}">
<Style.Triggers>
<!-- Reminder animation, when the time comes to remind the user -->
<DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource RemindUser}"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource StopRemindUser}"/>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
Ключ должен был разделить переплет и раскадровку на разные части.
Я думаю, вам придется установить анимацию Target, что-то вроде этого -
Storyboard.TargetName="yourWindowName"
Возможно, вы уже проверили это, но убедитесь, что в качестве DataContext вашего TpApplicationBarView задан правильный объект (имеющий свойство IndicateReminderAnimation).