Как скрыть модальный диалог, не возвращаясь из .ShowDialog? - PullRequest
7 голосов
/ 12 марта 2010

У меня есть приложение в vb.net, которое запускается с подфункции, делает некоторые вещи и решает, показывает ли оно себя или нет. Когда он показывает себя, он делает это, вызывая dialog.ShowDialog().

Когда dialog.ShowDialog() возвращается, приложение выполняет некоторую очистку и завершает работу.

Я бы хотел найти способ временно скрыть диалоговое окно (отправить его в системный трей), не возвращаясь из функции ShowDialog (). Однако, как только я сделаю me.Hide() в коде формы, форма будет эффективно скрыта, но функция ShowDialog () вернется, и процесс закроется.

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

Ответы [ 4 ]

6 голосов
/ 12 марта 2010

Если вы скроете диалог, вы вернетесь из ShowDialog (). Забудьте о попытке изменить это, вы не можете.

Возможно, вы сможете свернуть диалоговое окно.

form1.WindowState = FormWindowState.Minimized;

Или вы можете расположить его вне экрана.

form.Left = -16384;

Или вы можете сделать его прозрачным Изменение непрозрачности любого окна из C #

4 голосов
/ 12 марта 2010

Вы не можете сделать эту работу, ShowDialog () всегда будет возвращаться, когда форма скрыта. Хитрость заключается в том, чтобы использовать обычную форму и обычный вызов Application.Run (), но не допустить его немедленного отображения. Вставьте этот код в свой класс формы:

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    If Not IsHandleCreated Then
        CreateHandle()
        value = false
    End If
    MyBase.SetVisibleCore(value)
End Sub

Помните, что ваш обработчик события Load не будет работать до тех пор, пока форма фактически не станет видимой, поэтому обязательно выполняйте инициализацию в конструкторе Sub New.

0 голосов
/ 16 декабря 2018

Другой обходной путь - изменить свойство Opacity моделируемой формы на 0, чтобы сделать его полностью прозрачным.

private void MyModalForm_Load(object sender, EventArgs e)
{
    bool isShowing = true;
    //Do your thing.
    if(!isShowing) this.Opacity = 0.0;
    else this.Opacity = 1.0;
}
0 голосов
/ 06 апреля 2011

вы можете использовать флаг.

  1. Добавьте флаг к вашей форме: bool done = false;
  2. set done = true по завершении (в событии FormClosed).
  3. проверка наличия флага в функции вызывающего абонента (это сделано?)

    bool stilInMyFrm = false;
    MyFrm myFrm = new myFrm();
    
    try
    {
        stilInMyFrm = true;
        myFrm.ShowDialog();
        while (!myFrm.done)
            Application.DoEvents();
    }
    finally
    {
        stilInMyFrm = false;
        cleanup();
    }
    
...