2010-06-22 2 views
0

У меня есть два окна WPF Window1.xaml и window2.xaml. В window2.xaml.cs у меня есть одна функция, которая выполняет некоторые сложные вычисления и отображает промежуточные результы на TextBlock.Как открыть и обновить окно WPF путем потоковой передачи

Теперь, что я хочу. , нажав на кнопку Window1.xaml. Я хочу открыть Window2.xaml в качестве диалогового окна и выполнить сложную функцию windows2.xaml.

Если я вызываю сложную кнопку на событии загрузки Window2.xaml, тогда окно dilog появляется после выполнения сложной функции.

Как это сделать путем Threading.

ответ

1

Не нужно открывать окно в потоке. После того, как вы открыли Window2, запустите поток для сложной функции в обработчике событий . Это оставит ваш пользовательский интерфейс без изменений.

+0

private void Window_Loaded (отправитель объекта, RoutedEventArgs e) { Тема t = новая тема (ComplexFunction); t.Start(); } и ComplexFunction() { // делать что-то UpdateStatus ("adasd"); // что-то делать UpdateStatus ("dsad"); } Это дает ошибку времени выполнения. Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток UpdateStatus (состояние строки) { StatusText.AppendText (status + "\ r"); } –

+0

@Jeevan Bhatt: Если вы получаете доступ к любому элементу, созданному в UIThread, вам может потребоваться попросить диспетчера оказать вам услугу. 'myDispatcher.BeginInvoke (DispatcherPriority.Background, новое действие (() => {// Код, доступный для UIElement}));' где myDispatcher является ссылкой на Dispatcher.CurrentDispatcher Установите это перед вызовом потока. – Amsakanna

0

Открытие окна в нити, которая не является нитью пользовательского интерфейса, не рекомендуется вообще. Вы можете открыть всплывающее окно с использованием метода Show() (модель) или ShowDialog() (модальный) метод. В способе загрузки Window2 вы можете запустить новый поток, который выполняет сложную операцию, и как только это будет сделано с помощью операции, он может отобразить диалог.

Теперь, в то время как в другом потоке, кроме потока пользовательского интерфейса, если вы хотите показать любой пользовательский интерфейс (диалоговые окна, окна) или изменить существующий интерфейс (текстовый блок и т. Д.), Вы должны использовать метод Dispatcher.Invoke.

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