Как я могу заставить единственный экземпляр сформироваться (не приложение)?

В моем приложении C# у меня есть диалоговое окно опции, которое может быть открыто от команды меню.

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

Также, если пользователю уже открыли это окно, и он нажимает в пункте меню для открытия его снова, приложение просто делает уже видимую форму, стал самым верхним окном.

Кто-либо может указать на меня направления о том, как выполняют эти задачи?

Большое спасибо.

12
задан RHaguiuda 21 June 2010 в 19:30
поделиться

5 ответов

Вам понадобится эта форма как собственность

Form1 myForm = null;
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    myForm = null;
}

private void ShowForm()
{
    if (myForm != null)
    {
        myForm.BringToFront();
    }
    else
    {
        myForm = new Form1;
        myForm.Show();
    }
}
7
ответ дан 2 December 2019 в 03:53
поделиться

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

Обратите внимание, что это не то же самое, что сделать его синглтоном - потому что я предполагаю, что если форма будет закрыта, вы захотите создать новый экземпляр в следующий раз. (Альтернатива - скрытие и повторное использование - показана в ответе STO.) Вам может понадобиться что-то вроде этого:

public class OptionsDialog : Form
{
    private static OptionsDialog openForm = null;

    // No need for locking - you'll be doing all this on the UI thread...
    public static OptionsDialog GetInstance() 
    {
        if (openForm == null)
        {
            openForm = new OptionsDialog();
            openForm.FormClosed += delegate { openForm = null; };
        }
        return openForm;
    }
}

Конечно, вы можете заставить метод выполнять шаги «вывести его на передний план».

19
ответ дан 2 December 2019 в 03:53
поделиться

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

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (e.CloseReason == CloseReason.UserClosing) {
            this.Hide();
            e.Cancel = true;
        }
    }

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

    frmOptions options;

    private void btnShowOptions_Click(object sender, EventArgs e) {
        if (options == null) {
            options = new frmOptions();
            // To make absolutely sure:
            options.FormClosed += (o, ea) => options = null;
        }
        else {
            options.WindowState = FormWindowState.Normal;
        }
        options.Show();
    }
10
ответ дан 2 December 2019 в 03:53
поделиться

Я полагаю, у вас есть как минимум две формы. Одна форма, назовите ее frmMain, позволяет открывать frmOptions. В frmMain добавьте переменную типа frmOptions следующим образом:

public partial class frmMain : Form
{
     private frmOptions optionsInstance = null;
     ...

В подпрограмме, которая открывает диалоговое окно Options, добавьте следующее:

if (optionsInstance == null || !optionsInstance.Visible)
{
     optionsInstance = new frmOptions();
     optionsInstance.Show();
}

Когда frmOptions закрывается, optionsInstance не будет иметь значение null, поэтому вы проверяете, видна ли она перед созданием экземпляра. экземпляр frmOptions.

Если это не сработает, вы можете попробовать мьютекс, но это, вероятно, излишнее.

0
ответ дан 2 December 2019 в 03:53
поделиться

вы можете использовать такой код:

private MyDialogForm _FormInstance;

public void ShowOptions()
{
     if (_FormInstance == null)
     {
        _FormInstance = new MyDialogForm();
        _FormInstance.FormClosing += (s,e) => 
        {
             e.Cancel = true;
             _FormInstance.Hide();
        }
      }
     _FormInstance.Show();
}
2
ответ дан 2 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: