2012-04-13 4 views
1

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

У меня есть окно с несколькими эскизами. Когда пользователь нажимает на миниатюру, отображается другое окно (docview) с информацией, а в центре отображается документ.

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

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

Это то, что я делаю:

 viewgrid.Children.Add(docView); // the main window uses this grid to display the windows 
     viewgrid.InvalidateVisual(); 
     viewgrid.UpdateLayout(); // at this point I would like to have the docView visible 
     docView.showDocument(); //and afterwards, the loading of the document should start and be also visible eventually.. 

Я пробовал использовать событие LayoutUpdated без успеха. Кроме того, создание showDocument в отдельном потоке не помогло. Я также читал о Application.DoEvents(), но это устарело и, похоже, было плохой практикой.

Как мне это разрешить?

Заранее благодарен!

ответ

0

Чтобы загрузить документ, вам необходимо использовать объект BackgroundWorker. Вы сказали, что попробовали нарезание резьбы, и это не сработало, но вам нужно нарезать резьбу, и я рекомендую вам использовать фонового работника. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx

Я не уверен, какой тип документа, который вы загружаете, но я загрузил RichText файл, используя Binding, как описано здесь: http://www.rhyous.com/2011/08/01/loading-a-richtextbox-from-an-rtf-file-using-binding-or-a-richtextfile-control/

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

+0

Я не думаю, что вы вполне понимаете, чего я хочу. Все, что я хочу знать, это если есть какой-то «IsRendered», , так что я знаю, что когда мой макет отображается и отображается, я могу начать загрузку документа. Сам документ является powerpoint, загружаемым dll dll Microsoft PowerPoint. – Daan

+0

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

+0

Хорошо, но что мне делать, если фоновая работа выполняется с загрузкой ранее? Я не могу контролировать dll powerpoint. – Daan

0

Вы можете использовать асинхронные привязки. Или сделайте это вручную с помощью другого потока и Диспетчера. Но это зависит от того, что делает ваш ShowDocument, и это медленно.

+0

Как бы это сделать вручную? Я мог бы ждать поток, и когда экран docview будет виден, он может начать загрузку документа. Но как я узнаю, что экран загружен и видим? Событие layoutupdated слишком быстро срабатывает .. – Daan

+0

Я думаю, что я не совсем понимаю, что делает ваш showDocument. Медленно загружает документ из чего-то, а потом каким-то образом его показывает. Или он просто показывает некоторые элементы управления, но их рендеринг медленный & – Nikolay

+0

Метод showDocument добавляет WindowsFormHost в docview. Затем загружает документ с помощью DLL Microsoft Office Interop и помещает этот документ в Windows Formhost с помощью вызова SetParent. – Daan

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