Form.ShowDialog() не отображает окно с включенной отладкой - программирование

Form.ShowDialog() не отображает окно с включенной отладкой

Я создал тест в проекте Unit Test, в котором я хочу выставить форму, используя ее функцию ShowDialog():

[TestMethod]
public void TestDialog()
{
  // This class inherits from Form
  TestForm serviceTestForm = new TestForm("My test form"); 
  serviceTestForm.ShowDialog();

  return;
}

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

Мне нужно иметь возможность запускать тест "с отладкой" и отображать окно.

Другие примечания:

  • Show() нежелательно, так как он не дожидался продолжения закрытия окна. (Кроме того... он не работает.)
  • Этот же код работал ранее в другом проекте с использованием .NET 3.5. Это только для того, чтобы сказать, что стратегия ShowDialog() определенно работает раньше. (И да, я скопировал этот рабочий код напрямую.)
  • Мой вопрос похож на этот, однако моя форма не является дочерним элементом другого диалога и не живет в потоке родительского интерфейса.
4b9b3361

Ответ 1

Насколько я стараюсь избегать создания модульных тестов, использующих System.Windows.Forms, я столкнулся с нечетным случаем, когда мне это тоже нужно, и решил его обработать событие Load и явно установить Visible = true. Это заставляет форму видеть, когда ShowDialog вызывается из тестового метода.

private void form1_Load(object sender, EventArgs e)
{
    // To support calling ShowDialog from test method...
    this.Visible = true;
    ...
}

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

var frm = new Form1();
frm.Load += (sender, e) => (sender as Form1).Visible = true;
frm.ShowDialog();

Ответ 2

В моем случае, используя VS2017, установка свойства ShowInTaskbar как false добилась цели.

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

form.TopMost = true;
form.StartPosition = FormStartPosition.CenterScreen;
form.ShowInTaskbar = false;
form.ShowDialog();

P.S. Обнаружив это, я увидел то же решение в Отображении форм Windows внутри методов модульного тестирования.