2009-10-25 4 views
1

Предположим, что у меня есть нить 1, поток пользовательского интерфейса главного окна и поток 2, поток пользовательского интерфейса, который является модальным.Вызов делегата пользовательского интерфейса вызывает скрытие UI

Теперь нить 1 выполняет кусок кода и хочет изменить элемент пользовательского интерфейса в форме входа, чтобы он вызывал делегата, чтобы что-то изменить в потоке 2. Но когда он это делает, форма входа скрывается за основным окном и мне нечего возвращать. Выбор его на панели задач ничего не делает, и запись «Активировать()» в конце вызываемого метода тоже ничего не делает.

Как я могу сохранить интерфейс пользователя нити 2?

Благодаря

+0

Кроме того, когда есть только один поток, используя ShowDialog в форме входа, он блокирует в главном окне и форсировать форму входа в систему. Это уже не так, если у меня есть 2 потока, и я могу закрыть главное окно, пока форма входа еще открыта. Могу ли я воспроизвести поведение одного приложения потока с помощью двух потоков? – xster

+1

Вы хотите «блокировать» (модальное) поведение? Возможно, вы могли бы создать второй поток внутри формы входа, используя BackgroundWorker или что-то в этом роде. Отключить все элементы управления в диалоговом окне входа в систему, выполнить любые асинхронные задачи, которые вам нужны (вход в систему?), А затем, когда BackgroundWorker завершает его, либо разблокирует форму входа в систему, либо говорит «извините, попробуйте еще раз» или если форма успешно закрывается и позволяет вам к основному приложению. –

+0

Если бы я сделал это, пользовательский интерфейс входа в систему был бы таким же, как и основной интерфейс пользователя? Предположим, мне нужны независимые потоки пользовательского интерфейса, но в зависимости от поведения пользовательского интерфейса. т.е. я хочу, чтобы форма 2 рисовалась независимо от того, как занята форма 1, но я не хочу, чтобы на панели задач находились 2 значка. Я также не хочу, чтобы одна форма показывалась без другой. Возможно ли это на отдельных потоках? – xster

ответ

5

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

(в главном классе UI)

using (YourLoginForm f = new YourLoginForm()){ 

    YourLoginForm.Show(this) 
} 

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

0

wow .... сам pwn. k, исчезновение второго окна вещь не является вопросом

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

+2

Не добавляйте ответ на свой вопрос, если это не ответ. Разъясняющая информация должна быть добавлена ​​как комментарий или отредактирована в исходный вопрос. – bobbymcr

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