Запустить анимацию на основе свойства модели представления? - PullRequest
0 голосов
/ 04 ноября 2011

Я пытаюсь действительно придерживаться шаблона MVVM, и в результате мне трудно понять, как я могу заставить анимацию для представления запускаться каждый раз, когда устанавливается какое-либо свойство в модели представления (посредством привязки).

В моем MainWindow.xaml у меня есть ContentPresenter, и я связываю содержимое этого докладчика с моделью представления текущего представления, которое отображается для пользователя.Например, когда пользователь впервые запускает приложение, ContentPresenter будет привязан к StartViewModel.Если пользователь затем нажимает кнопку, которая переводит его на другой экран, например, для запуска исследования, ContentPresenter необходимо привязать к StudyViewModel, чтобы можно было отобразить экран StudyView.Затем, если пользователь желает вернуться к начальному экрану, ContentPresenter в этот момент снова будет привязан к StartViewModel, который был создан при запуске приложения.Это выглядит примерно так:

<Window
...
  <Grid
  ...
        <ContentControl
            x:Name="CurrentContentView"
            Width="Auto"
            Grid.Row="2" 
            Content="{Binding CurrentContentViewModel}" />
  </Grid>
</Window>

CurrentContentViewModel имеет тип "ViewModelBase", который является базовым классом, который я создал для всех моделей представлений, которые реализуют INotifyPropertyChanged.Я храню ObservableCollection ViewModelBase за кулисами, и каждый раз, когда происходит какое-то событие, которое должно заставить пользователя перейти на новый экран, я ищу соответствующую модель представления в этой коллекции и устанавливаю CurrentContentViewModel для этой модели представления.Если он еще не существует в моей коллекции, я сначала добавляю его в коллекцию, а затем устанавливаю CurrentContentViewModel для этой модели представления.

У меня вопрос: как заставить мои представления запускать "вводную" анимациюкаждый раз, когда вид отображается?Я не могу настроить запуск раскадровки каждый раз, когда представление просто загружается в мой ContentPresenter, потому что я также хочу снова запустить анимацию, когда пользователь возвращается к представлению, которое уже было загружено ранее при жизни приложения.Вдобавок ко всему, мое представление «тупое» и не имеет ни малейшего представления, что оно снова было отображено в MainWindow, потому что ContentPresenter в моем MainWindow привязан к модели представления, а не к представлению (так что это почти так, как если бы МОДЕЛЬ ВИДАнеобходимо запускать какое-либо событие каждый раз, когда оно привязывается к предъявителю контента, и представление должно будет отвечать на это событие).Есть ли способ, которым я могу объявить некоторый примитивный тип, например, логический в моей разметке xaml, который может связываться с логическим значением в моей модели представления?

Заранее спасибо за любые идеи, которые могут возникнуть, и извините, если этовопрос уже задан.Я нашел несколько похожих постов, но ничего похожего на то, что я хочу сделать.

ОБНОВЛЕНИЕ - НАЙДЕНО РЕШЕНИЕ

Как оказалось (по крайней мере, с реализацией)В настоящее время у меня есть), это было гораздо проще решить, чем я предполагал.Если вы строите свои представления с использованием шаблона шаблона данных (т.е. определяете шаблон данных для каждой из ваших моделей представления в словаре ресурсов, а затем добавляете этот словарь ресурсов в список ресурсов файла app.xaml), представление обновляется каждый разон удален из управления контентом.В моем случае, каждый раз, когда я связываю Контент моего Контента Контента с моделью представления, отличной от предыдущей, представление, которое было «построено» для этой модели представления, фактически удаляется.Затем, когда модель представления снова переназначается на управление контентом, представление создается заново.Поэтому я могу поместить свои экранные анимации вступления в событие Loaded XAML представления и мои экранные анимации экрана в событие UnLoaded XAML представления.

Я хотел бы поделиться этим в случае, если кто-то еще сталкиваетсяпохожая проблема - я не знал об этом типе поведения, используя шаблоны данных для отображения представления для модели представления.

1 Ответ

1 голос
/ 04 ноября 2011

Это скорее зависит от того, какая анимация вам нужна.Например, если вы хотите выдвинуть текущий вид, а затем передвинуть следующий, вы можете просто заставить свою модель управляющего вида вызвать два события: CurrentContentViewModelChanging и CurrentContentViewModelChanged.Ваше представление может запускать соответствующие анимации на основе этих событий.

Однако, если ваша анимация должна отображать новый вид одновременно со старым, все становится немного сложнее.Либо вам необходимо предоставить старое представление одновременно с новым, либо вам нужно, чтобы ваше представление сделало снимок старого представления непосредственно перед заменой нового представления. Опять же, вы должны иметь возможность использовать те же события длядостичь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...