Caliburn.Micro - делать что-то, когда вид становится видимым

В настоящее время я вхожу в WPF и Caliburn.Micro, пока без чего-то вроде MEF или Autofac.

Прямо сейчас я пытаюсь выполнить некоторый код в модели просмотра сразу после того, как ее представление станет видимым.

В связанном руководстве этот код отображает окно сообщения непосредственно перед отображением представления:

protected override void OnActivate() 
{   
    MessageBox.Show("Page Two Activated"); //Don't do this in a real VM.   
    base.OnActivate();   
}  

Затем г-н Айзенберг пишет следующее:

Помните, что если у вас есть какая-либо логика активации, которая зависит от уже загруженного представления, вы должны переопределить Screen.OnViewLoaded вместо / в сочетании с OnActivate.

Вот что у меня есть:

protected override void OnViewLoaded(object view)
{
    base.OnViewLoaded(view);
    MessageBox.Show("OnPageTwoViewLoaded");
}

Я также пробовал это через Grid EventTrigger и cal: ActionMessage. Но во всех трех случаях MessageBox появляется раньше, чем представление становится видимым.

Конечно, я что-то упускаю, что я делаю не так?


person user1018465    schedule 28.10.2011    source источник
comment
C.M создает экземпляры вашего представления до того, как вы действительно увидите их на экране. (То есть C.M не загружает их лениво) Таким образом, код OnViewLoaded запускается до того, как вы действительно увидите представление. Я думаю, что OnActivate должен быть правильным местом для этого, а не OnViewLoaded. Вы пробовали изолировать это конкретное поведение?   -  person EtherDragon    schedule 29.10.2011
comment
Спасибо за Ваш ответ. Я не знаю, что вы имеете в виду под песочницей, но если я помещу код MessageBox в OnActivate, он также будет показан до того, как представление станет видимым. Если я помещаю его в свой скрытый OnViewAttached, он заставляет OnViewLoaded выполняться раньше, что приводит к тому, что, похоже, работает. Однако, если я вставлю туда другой код, он все равно будет выполнен до того, как представление станет видимым.   -  person user1018465    schedule 29.10.2011
comment
@EtherDragon, так когда же CM на самом деле создает VIEW? Создает ли он их все при запуске?   -  person JobaDiniz    schedule 26.11.2015


Ответы (1)


Возможно, это не самое элегантное решение, но я думаю, вы можете сделать это из кода программной части, поскольку, строго говоря, это очень специфичная для просмотра / графического интерфейса вещь, которую вы пытаетесь сделать здесь. Например, в OnInitialized или OnRender. Если вы дадите своему представлению ссылку на EventAggregator, вы можете вызвать событие и создать модель представления - или любой другой класс, который вы хотите, подписаться на это событие и сделать это. Или в случае отображения MessageBox у вас действительно не было бы этого места где-либо еще, кроме View.

person Kjetil Klaussen    schedule 30.10.2011
comment
Они мне тоже не подходят. Caliburns OnViewAttached кажется наиболее близким к тому, что мне нравится, я посмотрю, достаточно ли это хорошо, или если я займусь этим со стороны этой модели / представления. - person user1018465; 06.11.2011
comment
OnViewLoaded кажется лучшим выбором для OnShown - person FindOutIslamNow; 26.11.2017