2012-06-08 2 views
1

Я хочу создать datatrigger, который делает мою страницу мигающей (от прозрачной до красной). Поэтому я создал DataTrigger, который слушает логический флаг в моей модели viewmodel. Этот флаг должен указывать, когда пользователю нужно напомнить. В этом случае моя страница должна мигать от прозрачного до красного.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> 

Итак, что я сделал неправильно?

Update: я могу увидеть следующее сообщение в окне вывода:

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' 

UPDATE2: После прибегая к помощи Arround я узнал, что это проблема с UI Thread. Поэтому я сделал вызов диспетчера всякий раз, когда устанавливал связанное свойство. Но даже с этим трюком нет цветовой анимации. Но ошибка в выходном окне, похоже, исчезла. Итак, я ищу дополнительные идеи о том, как исправить анимацию.

Update3: Как правило, проблема связана с настройкой цвета фона на странице. Но это действительно странно. Страница помещается в навигационную панель. Установка цвета фона в навигационном кадре изменит цвет приложения, но установка цвета фона на странице (даже без анимации) ничего не изменит.

+2

Вы внедрили 'INotifyPropertyChanged' для свойства' IndicateReminderAnimation'? Вы проверили окно вывода в VS во время выполнения, есть ли какие-либо ошибки привязки? – nemesv

+0

hm. Я внедрил INotifyPropertyChanged. Но я посмотрел на результат и произошла следующая ошибка: System.Windows.Media.Animation Warning: 6: Не удалось выполнить действие, потому что указанный Storyboard никогда не применялся к этому объекту для интерактивного управления; Действие = «Стоп»; 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 ' – BitKFu

ответ

0

Я нашел ошибку - или лучше две ошибки.

1.) Кажется, что невозможно изменить цвет фона страницы, расположенной в пределах рамки навигации.

Так первым должен был двигаться связывании и событие самого MainWindow (МОФ класса окна)

2.) Стиль, который содержит триггер данных не работает. После googling вокруг я нашел рабочее решение для того, что я ищу.

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

Ключом было разделить переплет и раскадровку на разные части.

+0

@ BitKFu: вы можете объяснить второй вопрос, неясно, что это значит? Я думаю, что это проблема с страницей, я пробовал свой стиль с помощью окна, и он работал правильно. – akjoshi

+0

Да, я знаю. Это действительно странно. Из-за вашего комментария я сам сделал тестовый проект и, по-настоящему, мог бы задать цвет фона на странице. В моем приложении это не сработает ... Так странно ... Если у меня будет больше времени, я попытаюсь воспроизвести его, потому что мне также интересно узнать ответ на этот мистерий. – BitKFu

0

Я думаю, что вы должны установить анимацию Target, что-то вроде этого -

Storyboard.TargetName="yourWindowName" 

вы уже проверили это, но убедитесь, что правильный объект установлен как DataContext ваш TpApplicationBarView в (с IndicateReminderAnimation недвижимости) ,

+0

Извините, но я не могу указать целевое имя в стиле. – BitKFu