2014-12-18 9 views
0

У меня есть приложение, где мне нужно отобразить форму загрузки на некоторые действия. Итак, у меня есть кнопка, которая открывает форму, и когда я нажимаю на эту кнопку, мне нужно отобразить мою загрузочную форму. Я использую следующий код:Показать форму загрузки

private void diligênciasToolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
LoadingWindow loadingWindow = new LoadingWindow(); 
try 
{ 
    loadingWindow.Show(); 
    Cursor.Current = Classe_Cursor.LoadCustomCursor(@"D:\Wait (1).ani"); 
    FormConsultaDiligencia Childform = new FormConsultaDiligencia(); 
    Childform.MdiParent = this; 
    Childform.Show(); 
    Cursor.Current = Cursors.Default; 
    loadingWindow.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("" + ex.Message); 
} 
} 

При нажатии на эту кнопку открывается LoadingWindow, но элементы, которые я внутри формы не работают: enter image description here

Все выглядит как пустой, и это было бы появляются как:

enter image description here

Что здесь происходит? Я не могу попасть туда один, может кто-нибудь объяснить мне, в чем проблема?

+0

Whitch версия .Net Framework, которую вы используете? – Vlad

+0

Появляется ли экран rere после того, как вы показываете форму? Или ваш CPU занят? – DrKoch

+0

Итак, это ваша цель для 'loadWindow' для отображения во время создания и инициализации' Childform' (что занимает много времени), а затем для скрытия? – adv12

ответ

2

Это происходит потому, что вы показываете форму и выполняете длительные операции в потоке графического интерфейса пользователя. Вы должны выполнить эти операции в потоке backgroung. EDIT: код удален.

+0

Ваш пояснительный текст в порядке, но этот код просто задерживает привязку потока пользовательского интерфейса. Все внутри этого 'Invoke()' будет происходить синхронно в потоке пользовательского интерфейса, даже если 'Invoke' вызывается из фонового потока. – adv12

+0

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

+0

В части whitch? Этот код должен работать. – Vlad

0

После того, как istruction loadingWindow.Show() функция щелчка зависает путем загрузкиWindow, который, кажется, не заполнен компонентами.

Перезапуск кода из Cursor.Current = Classe_Cursor.LoadCustomCursor (@ "D: \ Wait (1) .ani") после закрытия пользователем окна загрузки.

istruction loadingWindow.Close() - это ошибка: в этот момент LoadWindow уже закрыт.

Я думаю, вам нужно загрузить анимацию и строки в конструктор loadWindow.

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

Решение, предложенное adv12, будет вашим желательным.

-3

EDIT - РЕШЕНИЕ Я нахожу решение этой проблемы. Создано Класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Drawing; 
using System.Threading; 
using System.Windows.Forms; 

namespace ABDC 
{ 
public class PleaseWait : IDisposable 
{ 
    private Form mSplash; 
    private Point mLocation; 

    public PleaseWait(Point location) 
    { 
    mLocation = location; 
    Thread t = new Thread(new ThreadStart(workerThread)); 
    t.IsBackground = true; 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
    } 
    public void Dispose() 
    { 
    mSplash.Invoke(new MethodInvoker(stopThread)); 
    } 
    private void stopThread() 
    { 
    mSplash.Close(); 
    } 
    private void workerThread() 
    { 
    mSplash = new LoadingWindow(); // <-Loading form here 
    mSplash.StartPosition = FormStartPosition.CenterScreen; 
    mSplash.Location = mLocation; 
    mSplash.TopMost = true; 
    Application.Run(mSplash); 
    } 
} 
} 

И тогда я использовал это так:

Cursor.Current = Classe_Cursor.LoadCustomCursor(@"D:\Wait (1).ani"); 
using (new PleaseWait(this.Location)) 
{ 
FormConsultaDiligencia Childform = new FormConsultaDiligencia(); 
Childform.MdiParent = this; 
Childform.Show(); 
Cursor.Current = Cursors.Default; 
} 

И это работает!

спасибо всем, с наилучшими пожеланиями

+1

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

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