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()
определенно работает раньше. (И да, я скопировал этот рабочий код напрямую.)
- Мой вопрос похож на этот, однако моя форма не является дочерним элементом другого диалога и не живет в потоке родительского интерфейса.
Ответы
Ответ 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 внутри методов модульного тестирования.