DSomesh Ответов: 2

Как вывести форму windows на передний план в C#?


In my application when the user clicks on a label to open a form the form opens in the background.I mean it does not come to the front but is rather placed on taskbar. once the user cancels that instance of form and again clicks on the label,the form opens in foreground.Following portion of code does the specific work.


if (DataFormDlg.Instance.InvokeRequired)
       {
           DataFormDlg.Instance.BeginInvoke(
               new ShowDataFormDelegate(ShowDataForm), pageId, timeout);
           return;
       }

       DataFormDlg.Instance.CurrentPageId = pageId;
       DataFormDlg.Instance.Timeout = timeout;

       if (!DataFormDlg.Instance.Visible)
           DataFormDlg.Instance.ShowDialog();
       else
           DataFormDlg.Instance.Focus();


Here the DataFormDlg is derived from windows form.


Что я уже пробовал:

Я слышал, что BringToFront() и Activate () могут помочь, но не уверен, как их использовать.

Ravi Bhavnani

Попробуйте DataFormDlg.Пример.TopMost = true;

/ Рави

Philippe Mori

Тебе это почти никогда не нужно... Если он не работает, значит, что-то не так было сделано, как не установил владелец.

Philippe Mori

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

Если форма находится в панели задач, то вы, вероятно, не устанавливаете владельца и не настраиваете свойства формы.

На самом деле, вероятно, труднее заставить его работать неправильно, так как обычно он просто работает так, как ожидалось.

BillWoodruff

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

2 Ответов

Рейтинг:
2

Philippe Mori

Ты выглядишь подозрительно...

Зачем вам создавать форму из произвольного потока?

Почему модельная форма будет уже видна?

Что такое свойство экземпляра (или каков тип DataFormDlg?).

Где находится код этого вызова DataFormDlg конструктор?

В большинстве приложений вам никогда не нужно будет использовать BringToFront(), Activate(), Focus() или TopMost Очевидно, вы делаете простые вещи очень сложными.

Обычно вы просто делаете что-то подобное, и это работает:

void ParentForm_ShowDialogClicked(object sender, EventArgs args)
{
    using (var form = new DataFormDlg())
    {
        form.ShowDialog(this);    // or ParentForm for owner if inside a UserControl.
    }
}


Ravi Bhavnani

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

Самое верхнее свойство-это самый простой способ убедиться, что приложение "всегда" видно на рабочем столе.

/ Рави

Philippe Mori

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

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

В любом случае, нет смысла иметь синглтон в модальном диалоге. Модальный диалог должен существовать только тогда, когда он отображается.

Ravi Bhavnani

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

> Это не имеет смысла, чтобы иметь синглтон, чтобы модальное диалоговое окно.
Я согласен.

/ Рави

Рейтинг:
1

Dave Kreskowiak

Единственный раз, когда я видел, как это происходит, - это когда вы создаете и показываете форму (С.Show вместо .ShowDialog) из диалоговой формы. Диалог всегда будет сверху, пока он не будет отклонен. Тогда ваша вновь созданная форма будет иметь фокус и находиться на вершине.


Philippe Mori

.. и, вероятно, без того, чтобы владелец был должным образом настроен на активную и включенную форму.