2013-12-20 8 views
1

фона:WPF Animation не оживляет. (Начальный экран)

Я пытаюсь добавить анимацию в окно всплеска экрана в моем проекте WPF. (Не использовать фактический элемент управления SplashScreen.) Я использую окно.)

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

Вот идея моего нынешнего подхода:

  1. Инстанцировать окно SplashScreen в начале конструктора.
  2. Вызывается InitializeComponent().
  3. Закройте окно заставки.

К сожалению, анимация в заставке не начинается до тех пор, пока не вызывается метод InitializeComponent() главного родительского окна; это происходит в основном, когда я ХОЧУ закрыть окно всплывающего окна в любом случае. Следовательно, анимация бесполезна и не начинается, пока не стало слишком поздно.

Мой вопрос:

  1. Почему это не анимировать, пока называется InitializeComponent()?

  2. Моя нынешняя теория, почему это происходит, состоит в том, что это связано с тем, что экран всплеска открывается в основном потоке пользовательского интерфейса. Я прав?

  3. Есть ли какие-либо обходные пути, которые не связаны с захватом управления программой и нерест заставки в новом потоке? (Я не хочу решения, которое хак)

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

+3

Почему вы считаете создание экрана Splash в другом потоке хаком? это не. Это на самом деле единственное решение, которое у вас есть, когда ваш пользовательский интерфейс тяжелый, и для загрузки требуется время. –

+2

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

+2

Причина, по которой она не анимируется, заключается в том, что поток пользовательского интерфейса занят своими делами и не имеет времени для анимации. Освободите поток пользовательского интерфейса или создайте экран Splash в другом потоке. –

ответ

1

Время обработки в потоке пользовательского интерфейса блокирует анимацию. Никакого реального пути вокруг.

Лучший подход - НЕ тратить так много времени на загрузку и блокировку потока пользовательского интерфейса. Я предлагаю вам задержать загрузку данных, привязанных к вашим элементам пользовательского интерфейса, до момента начальной загрузки.Таким образом, InitializeComponents() не должен занимать так много времени.

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

Это позволит вашему заставному экрану оживить, и у вас будет гораздо больше радости.

1

Есть несколько подходов, которые я взял, чтобы справиться с этим в прошлом, хотя @HighCore прямо в комментариях, а также о текущей задаче

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

Смежные вопросы