Выполнить действие после того, как пользовательский элемент управления на вкладке отображается - PullRequest
0 голосов
/ 27 января 2012

В моем приложении MVVM у меня есть элемент управления вкладками с парой вкладок. Всякий раз, когда вкладка выбрана, пользовательский элемент управления на этой вкладке загружается, и в конструкторе этого пользовательского элемента управления выполняется вызов, выполнение которого занимает немного времени.

Я хочу изменить это так, чтобы вызов выполнялся после того, как пользовательский элемент управления загружен и видим для пользователя. Я пробовал событие IsVisibleChanged, но оно возвращает Visible = true, прежде чем я на самом деле вижу элемент управления, почти один раз, когда я нажимаю на вкладку.

Есть ли способ, которым я могу сделать вызов только после того, как элемент управления загружен и отображается на экране пользователю?

Обновление: Дополнительная информация Вызов прямо сейчас - это асинхронный вызов. Похоже, проблема заключается в том, что после выполнения вызова asycn источник данных в сетке пользовательского элемента управления обновляется, и это занимает секунду или около того. В результате, похоже, что для переключения вкладок требуется примерно секунда, когда на самом деле происходит загрузка сетки данными. Вот почему я искал способ запустить запрос, который запускает возможную загрузку данных только после того, как переключатель табуляции завершен и пользовательский элемент управления виден

Ответы [ 3 ]

1 голос
/ 28 января 2012

Вы должны сделать асинхронный вызов вашего трудоемкого метода / функции.В .NET 4 и TPL это легко сделать с помощью Task класса ...

Task.Factory.StartNew(MyLittleTimeFunction);

или:

Task.Factory.StartNew(() => serviceAgent.MyFunc(myParam)).
    ContinueWith(t => MyOtherFunc(myOtherParam));
0 голосов
/ 27 января 2012

Я думаю, это хорошее место, чтобы использовать событие.Класс FrameworkElement уже предоставляет событие Loaded.Класс Window и пользовательский элемент управления TabControl наследуются от него, поэтому вы можете использовать это событие.Все, что вам нужно сделать, это переместить вызов на это событие.Простой пример см. На странице событий MSDN Loaded.

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

0 голосов
/ 27 января 2012

Используйте событие Loaded (Происходит, когда FrameworkElement был создан и добавлен в дерево объектов.) FrameWorkElement (из которого все элементы управления WPF получены из ... так что и ваш usercontrol;)

Подробнее см. MSDN .

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