В C #, как показать GUI из другого GUI, основываясь на событии из класса в другом потоке? - PullRequest
0 голосов
/ 14 апреля 2010

Я работаю над симулятором на основе DirectX.На котором я должен проверить устройство, было ли устройство подключено или удалено с ПК.

Мне удалось создать классы для прибытия и удаления устройства в другом потоке, который вызывает событие изсама нить при получении или удалении устройства .Соответствующий метод события вызывается в главной форме и там:

Предположим, Form1 - главное окно, а Form2 - вторичное.

Form2 form2Instance = new Form2();

Я хочу показать другую форму(Form2) оставляя главное окно (Form1) позади (так же, как оно ведет себя как form2Instance.ShowDialog(); в общих случаях.) После нескольких попыток я сделал это с помощью

Applicatin.Run(new Form2());, ноForm2 не ведет себя как 'form2Instance.ShowDialog(); в любом случае.

Просто даю код, если он может помочь в ответе:

iARMdetectionThreadClass detection;
InProgram_iARMdetection iARMStatusGUI;

 private void Form2_Load(object sender, EventArgs e)
        {
         iARMStatusGUI = new InProgram_iARMdetection();
         detection = new iARMdetectionThreadClass();
         detection.IniARM_device_Arrive += new iARMdetectionThreadClass.iARM_device_ArrivedEventHandler(detection_IniARM_device_Arrive);
         detection.IniARM_device_Remove += new iARMdetectionThreadClass.iARM_device_RemovedEventHandler(detection_IniARM_device_Remove);
         detection.startThread();
        }


 void detection_IniARM_device_Remove(iARM_deviceInfo senderInfo)
        {

            detection.StopCheckBeingRemoved();
            MethodInvoker act = delegate
            {
                this.label_iARMStatus.Text = detection.iARM_deviceInf.iARMStatus;
            };
            this.label_iARMStatus.BeginInvoke(act);

            Application.Run(new InProgram_iARMdetection()); //Blocking code

            detection.StartCheckBeingRemoved();

        }

 void detection_IniARM_device_Arrive(iARM_deviceInfo senderInfo)
        {
            MethodInvoker act = delegate
            {
                this.label_iARMStatus.Text = detection.iARM_deviceInf.iARMStatus;
            };
            this.label_iARMStatus.BeginInvoke(act);
            //detection.StopCheckArriving();
            //detection.StartCheckArriving();
        }

Мне нужен код, чтобы быть БлокировкаКод .Здесь:

Application.Run(new InProgram_iARMdetection()); //Blocking code

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Возможно mainform.AddOwnedForm(form2) будет делать то, что вы хотите. Он будет отображать form2 перед mainform, и когда один из них свернут, другой также.

0 голосов
/ 14 апреля 2010

Вы должны обработать событие удаления в form2, а не form1 и использовать метод ShowDialog ().

Так что, когда в форме 1 сработает событие прибытия, оно откроет форму 2 как диалог. Теперь, когда устройство будет отключено, на форме form2 будет происходить удаление, где вы можете закрыть форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...