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).

Другие вопросы по тегам