2012-01-09 2 views
0

Я новичок в C#, и у меня возникают проблемы с объявлением переменных.Установить переменную или ссылку на уже открытую форму

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

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

Любая помощь была бы принята с благодарностью.

Благодаря ...

+0

частная Пустота область применения и тип (или отсутствие там). Вы имеете в виду два разных класса? Можете ли вы предоставить немного кода для уточнения? –

+0

Привет, Джефф, спасибо за ответ, я только что вернулся с работы, мне придется отправлять код завтра. – sotiris

+0

На уровне класса вы просто объявляете переменную. – Paparazzi

ответ

0

Объявить форму в классе, но метода:

Form2 frm2 = new Form2(); 

Но показать его при необходимости: (-в методе)

frm2.Show(); 

(Мой ответ для winforms.Я теперь заметил, что вы имеете в виду wpf. Я не знаю, работает ли оно одинаково.)

+0

Это именно то, что я хочу сделать бит в wpf. – sotiris

0

Взгляните на BackgroundWorker и how to use it. Существует вся информация, которая вас интересует.

+0

Ручка runworkercompleted уже настроена и работает, внутри этого я хочу ссылаться на уже открытую форму wait, чтобы я мог ее закрыть. Я не уверен, как настроить эту ссылку, так как форму ожидания мы открыли в отдельном типе. – sotiris

1

Если вы имеете в виду класс BackgroundWorker в .NET, у него есть событие RunWorkerCompleted. Просто зарегистрируйте обработчик событий, чтобы закрыть форму.

EDIT

Лучше читать MSDN documentation for BackgroundWorker. Обратите внимание, что есть два примера, второе лучше, так как первый код регистрации событий не является полезным для понимания. И в нижней части страницы представлен пример с комментариями, который довольно хорош (BGW Nuances, включая Sample with ProgressBar).

Может быть, этот план является полезным:

  1. Вашего MainForm инстанцирует WaitForm (а ProgressBar?)
  2. Вашего MainForm создает экземпляр BackgroundWorker
  3. Ваш MainForm имеет соответствующие обработчик событий для BackgroundWorker и ProgressBar событий.
  4. A ProgressBar не должен быть явно закрыт.
+0

Ручка runworkercompleted уже настроена и работает, внутри которой я хочу ссылаться на уже открытую форму wait, чтобы я мог ее закрыть. Я не уверен, как настроить эту ссылку, так как форму ожидания мы открыли в отдельном типе. – sotiris

+0

Но как RunWorkerComplete получает ссылку на эту форму? – Paparazzi

0

Вы можете, сделать, может быть что-то вроде этого, если я исправляю понял ваши намерения:

public class FormWait 
{ 
    private static FormWait frm = new FormWait(); 

    public static void ShowForm(string message) 
    { 
     Show(message); 
    } 

    public static void Close() 
    { 
     Application.Current.Dispatcher.Invoke(new Action(() => 
      { 
        if(!frm.Visible) 
         return; 

        frm .Close(); 
      })); 


    } 

    private void Show(string str) 
    { 
     Application.Current.Dispatcher.Invoke(new Action(() => 
      { 
       if(frm.Visible) 
        frm.Close(); 
       lblMessage.Text = message; // assume that there is a label on the Form to show the message 

        frm .Show(); 
      })); 


    } 

    } 

Просто идея.

0

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

public partial class MainWindow : Window 
{ 
    NavigationWindow winWait; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnShow(object sender, RoutedEventArgs e) 
    { 
     if (winWait != null) return; 
     winWait = new NavigationWindow(); 
     winWait.Content = new PageWait(); 
     winWait.Show(); 
    } 

    private void btnHide(object sender, RoutedEventArgs e) 
    { 
     if (winWait != null) winWait.Close(); 
    } 

} 

Если вы хотите иметь несколько форм ожидания, то вам нужно будет немного поучаствовать. У вас не будет переменной Navigation в классе, а создайте ее и передайте ее на задний план, чтобы ее можно было вернуть обратно на вызов. И вам нужно иметь дело с = = null, но не активным.

0

Для тех, кто это может касаться:

Используя очень полезный код BalamBalam, я смог получить эту работу, как показано ниже:

  class DatabaseUpdater 
{ 
// Declare the background worker and WaitForm at Class Level 
static BackgroundWorker bw; 
public static Form WaitForm; 


public static void DelegateWorkStuff() 
{ 

    // Set up the background process and show WaitForm in here   

    bw = new BackgroundWorker(); 
    bw.WorkerReportsProgress = true; 

    WaitForm = new WaitForm(); 
    WaitForm.Show(); 

    bw.DoWork += bw_DoWork; 
    bw.ProgressChanged += bw_ProgressChanged; 
    bw.RunWorkerCompleted += bw_RunWorkerCompleted; 
    bw.RunWorkerAsync(); 
} 

    static void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Run the lenghty code/processes in here 
    } 

    static void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) 
    { 
     //Close the Waitform thus 
     WaitForm.Close(); 
    } 
Смежные вопросы