2014-11-21 8 views
1

Я вызываю окно Winforms из другого объекта winforms (предположительно, это просто окно загрузки), но когда вызывается window.Show(), все, что я вижу, это: enter image description hereЭлементы управления Winforms не отображаются

Верхнее пространство должно быть меткой с «ожидающим» текстом, а нижняя часть должна быть анимированным GIF. Я сделал шаг, чтобы проверить, что для этого объекта вызывается InitializeComponent(). Вот код, который называет его:

 LoadWindow loading = new LoadWindow(); 
     loading.Show(); 
     loading.BringToFront(); 

     //Perform loading function in background worker 
     //BackgroundWorker worker = new BackgroundWorker(); 
     //worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     //worker.RunWorkerAsync(); 

     // Close the loading window 
     System.Threading.Thread.Sleep(10000); 
     loading.Close(); 

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

+1

А что, если вы удалите Sleep()? – sdeep

+0

Не могли бы вы разместить свой код, как он выглядит с этим «BackgroundWorker». А также отправьте «worker_DoWork'-Method – Tomtom

+0

Попробуйте удалить' Sleep() 'и сделайте вызов' Close() 'из' worker_DoWork' через 'BeginInvoke()' loading ' –

ответ

3

Вы замораживаете свою тему пользовательского интерфейса Thread.Sleep(). Таким образом, элементы управления не могут привести к недействительности его компоновки. И я думаю, что звонок loading.Close() должен был быть в BackgroundWorker.RunWorkerCompleted события.

private void Show() 
{ 
    LoadWindow loading = new LoadWindow(); 
    loading.Show(); 
    loading.BringToFront(); 

    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(
     (s, e) => 
     { 
      // your logic 
      Thread.Sleep(10000); 
     }); 
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     (s, e) => 
     { 
      loading.Close(); 
     }); 
    worker.RunWorkerAsync(); 
} 
1

Я думаю, ваша проблема в вызове Thread.Sleep(10000) в UI-Thread.

Возможное решение это было бы:

public void LoadSomething() 
{ 
LoadWindow loading = new LoadWindow(); 
loading.Show(); 
loading.BringToFront(); 

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerCompleted += WorkerOnRunWorkerCompleted; 
worker.RunWorkerAsync(loading) 
} 

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
// Do your background-work here 
Thread.Sleep(10000); 
e.Result = e.Argument; 
} 

private void WorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
LoadWindow loading= (LoadWindow)e.Result; 
loading.Close(); 
} 
+0

Спасибо Tomtom! Я не мог заставить работу (LoadWindow) e.Result работать, поэтому единственными параметрами, которые у меня были, было сделать загрузку глобальной переменной (bleah) или использовать предложение al-amanat и использовать lambda. – FeelsLikeANewb

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