Есть ли какие-либо последствия для стенограммы? - PullRequest
3 голосов
/ 11 августа 2009

Любой, кто когда-либо работал с пользовательским интерфейсом .Net и WinForms, хорошо знаком с этим типом кода:

TestForm frm = new TestForm();
frm.ShowDialog();

Я обнаружил, что хочу, чтобы вызов для показа модального диалога был немного менее многословным, больше похож на статический вызов. И есть более простой способ. Все, что вам действительно нужно, в простом случае, это что-то вроде этого:

new TestForm().ShowDialog();

Я что-то упустил? Могут ли быть какие-либо последствия от такого рода сокращений? Например. Сообщения Windows не обрабатываются / маршрутизируются неправильно, ресурсы диалога не располагаются и т. д .?

Работал над этим, когда увидел отзывы Рэя:

Полагаю, еще более коротким способом было бы создание статического члена с помощью TestForm, который создает собственный экземпляр и вызывает ShowDialog внутри. Итак, этот код:

public static DialogResult DoModal()
{
    return new TestForm().ShowDialog();
}

может быть вызвано так:

TestForm.DoModal();

Ответы [ 3 ]

5 голосов
/ 11 августа 2009

Если вы не хотите повторно использовать объект формы где-либо в коде, вы можете просто использовать краткую форму

new TestForm().ShowDialog();

Если вы хотите что-то сделать позже с этим объектом, вы должны присвоить его переменной.

2 голосов
/ 11 августа 2009

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

Например, см. Исходные коды MessageBox (Mono, если я не ошибаюсь) ссылка

1 голос
/ 12 августа 2009

Типичное использование ShowDialog должно выглядеть следующим образом:

using (Form form = new Form())
{
    // here setup your form instance

    if (DialogResult.OK == form.ShowDialog())
    {
        // here read data from form instance
    }
}

Обратите внимание, что ShowDialog () приводит к тому, что экземпляр формы не располагает себя. Вы должны утилизировать его вручную после того, как с ним покончено - следовательно, используйте предложение. См. http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx для деталей. В вашем сценарии это должно выглядеть так:

public static DialogResult DoModal()
{
    using (Form form = new TestForm())
        return form.ShowDialog();
}

Но это полезно только тогда, когда вам не нужно читать какие-либо данные из экземпляра формы. Таким образом, единственный сценарий, который подходит здесь, это окно сообщения. Методы MessageBox.Show (...) используют шаблон, который вы хотите реализовать в своем посте.

в других сценариях формы должны возвращать данные, отличные от DialogResult, обратно в приложение после их закрытия. И именно поэтому стандартная форма не имеет статических методов ShowDialog () или DoModal (). Статический метод должен располагать временной формой экземпляра. Такое удаление сделало бы невозможным чтение данных обратно из формы. Более того, в сценарии статического метода нет экземпляра формы для чтения данных.

Собрав все вместе, ваш метод, чтобы соответствовать рекомендациям, должен выглядеть примерно так:

public static YourResultClass DoModal()
{
    using (TestForm form = new TestForm())
    if (DislogResult.OK == form.ShowDialog())
    {
        YourResultClass result = new YourResultClass();
        // Here initialize YourResultClass instance with data from form instance
        return result;
    }
}

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

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