Запустить анимацию на основе свойства модели представления?
Я пытаюсь действительно придерживаться шаблона 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 привязан к модели представления, а не к представлению (так что это почти так, как если бы VIEW MODEL необходимо запускать какое-либо событие каждый раз, когда оно связывается с представителем содержимого, и представление должно будет отвечать на это событие). Есть ли способ, которым я могу объявить некоторый примитивный тип, например, логический в моей разметке xaml, который может связываться с логическим типом в моей модели представления?
Заранее благодарим за любые идеи, которые кто-либо может иметь, и извините, если этот вопрос уже был задан. Я нашел несколько похожих постов, но не совсем то, что я хочу сделать.
ОБНОВЛЕНИЕ - РЕШЕНИЕ НАЙДЕНО
Как оказалось (по крайней мере, с той реализацией, которая у меня сейчас есть), эту проблему было решить гораздо проще, чем я предполагал. Если вы строите свои представления с использованием шаблона шаблона данных (т.е. определяете шаблон данных для каждой из ваших моделей представления в словаре ресурсов, а затем добавляете этот словарь ресурсов в список ресурсов файла app.xaml), представление обновляется каждый раз он удален из управления контентом. В моем случае, каждый раз, когда я связываю Контент моего Контента Контента с моделью представления, отличной от предыдущей, представление, которое было "построено" для этой модели представления, фактически удаляется. Затем, когда модель представления снова переназначается на управление контентом, представление создается заново. Поэтому я могу поместить свои экранные анимации в событие Loaded XAML представления, а мои экранные анимации в событие UnLoaded XAML представления.
Я хотел поделиться этим в случае, если кто-то еще сталкивается с подобной проблемой - я не знал об этом типе поведения, используя шаблоны данных для отображения представления для модели представления.
1 ответ
Это скорее зависит от того, какая анимация вам нужна. Например, если вы хотите выдвинуть текущий вид, а затем перейти к следующему, вы можете просто заставить свою модель управляющего вида вызвать два события: CurrentContentViewModelChanging
а также CurrentContentViewModelChanged
, Ваш вид может запускать соответствующие анимации на основе этих событий.
Однако, если ваша анимация должна показывать новый вид одновременно со старым, все становится немного сложнее. Вам либо нужно открыть старый вид одновременно с новым, либо вам нужно сделать снимок старого снимка непосредственно перед заменой нового вида. Опять же, вы должны иметь возможность использовать те же события для достичь этого.