C # Статическая форма добавлена ​​в проект? - PullRequest
4 голосов
/ 27 октября 2011

Я хочу создать настраиваемое окно сообщения для программы, поэтому я добавил элемент формы Windows. Я бы хотел, чтобы он вел себя как MessageBox в том смысле, что он статический, и я просто звоню MessageBox.Show(a, b, c, ...) Однако в конструкторе форм я не вижу, как сделать его статичным. Могу ли я просто добавить static к коду? Есть ли параметр свойства, который мне не хватает в режиме конструктора?

Спасибо!

Ответы [ 4 ]

6 голосов
/ 27 октября 2011

MessageBox не является статическим классом, однако метод Show.Сделайте Show статическим, в коде.Например,

public class MyMessageBox : Form
{
    public static int MyShow()
    {
        // create instance of your custom message box form
        // show it
        // return result 
    }
}
4 голосов
/ 27 октября 2011

Это обычный класс с одним статическим методом, который создает новый экземпляр и действует.

public class MyMessageBox
{
   public static MyResult Show(params)
   {
       var myMessageBox = new MyMessageBox();
       myMessageBox.Message = params ...
       return  myMessageBox.ShowDialog();
   }
}
2 голосов
/ 27 октября 2011

Добавьте статический метод к вашей форме, который отображает себя и возвращает DialogResult:

public partial class MyMessageBoxForm : Form {

  public static DialogResult Show(string message) {
    using (MyMessageBoxForm form = new MyMessageBoxForm(message)) {
      return form.ShowDialog();
    }

  private MyMessageBoxForm(string message) {
    // do something with message
  }

}
1 голос
/ 27 января 2015

Если вы хотите создать статическую форму Form1 для доступа к ней без ссылки на объект, вы можете изменить Program.cs:

public class Program
{
    public static Form1 YourForm; 

    [STAThread]
    static void Main(string[] args)
    {
        using (Form1 mainForm = new Form1())
        {
            YourForm = mainForm;
            Application.Run(mainForm);
        }
        YourForm = null;
    }
}

и вызов методов класса Form1 из любого места вашей программы:

Program.YouForm.DoAnything();

Не забудьте вызвать Invoke для доступа из других потоков.

...