Member 10850253 Ответов: 3

Как мне ... создать одноэлементную форму C#


У меня есть приложение c# windows Form, которое создает несколько экземпляров одного и того же окна, когда я дважды щелкаю ярлык, но мне нужен только один экземпляр окна.
Может ли кто-нибудь сказать мне, как это сделать?
Спасибо.

Что я уже пробовал:

Я попробовал то, что было описано в этом видео:
Паттерн Синглтон - Ютуб[^]

3 Ответов

Рейтинг:
2

Wendelius

Вы можете использовать одноэлементный шаблон, чтобы гарантировать, что существует только один экземпляр, но я думаю, что было бы проще просто перебирать его Приложение.Свойство OpenForms (System.Окна.Формы)[^].

Пройдитесь по коллекции, проверьте, существует ли форма, и если да, активируйте ее, если нет, создайте.

[РЕДАКТИРОВАТЬ]
Пример цикла для итерации по формам

bool formOpen = false;

foreach (Form form in Application.OpenForms) {
   if (form.Name == "Form1") {
      formOpen = true;
      break;
   }
}
if (formOpen) {
   MessageBox.Show("Form is already open");
} else {
   MessageBox.Show("Form is not open");
}


Member 10850253

Я попытался сравнить приложение.Открытые формы.Count==0, и если это правда, то я запустил приложение, но оно не работает, и мне было интересно, не могли бы вы сказать мне, где мне нужно использовать это свойство?

Wendelius

Мне очень жаль, но я не совсем понимаю. Существуют ли формы в разных приложениях?

Другими словами, вы пытаетесь предотвратить запуск приложения, если оно уже выполняется, или вы пытаетесь предотвратить повторное открытие формы внутри одного приложения?

Member 10850253

да

Wendelius

Которая Да? Только одна заявка или только одна форма внутри заявки?

Member 10850253

одна форма в заявке

Wendelius

Взгляните на измененный ответ.

Member 10850253

Я добавил решение, чтобы вы могли просмотреть код,не могли бы вы помочь?

Wendelius

Форма не найдена, потому что вы поместили код в начало программы, где еще не созданы формы.

Основной метод обычно запускается только один раз, когда приложение запускается. на данный момент только одна форма создается с помощью метода Run класса Application. Таким образом, на данный момент в одном приложении невозможно создать две одинаковые формы.

Не могли бы вы объяснить ситуацию более подробно?

Member 10850253

Я не знаю, где разместить этот код внутри моей формы, чтобы он не создавал 2 экземпляра. Я знаю, что где-то должно быть что-то вроде new form (), но я не знаю.

Wendelius

Но если у вас нет кода

новая форма BatteryMonitorForm()

где угодно, только не в приложении.Run (new BatteryMonitorForm ()); тогда у вас не будет двух форм этого класса...

Какова ситуация, когда у вас есть 2 формы BatteryMonitorForm?

Member 10850253

Чего я не хочу, так это чтобы приложение открыло 2 экземпляра приложения, если я дважды щелкну ярлык приложения дважды.

Wendelius

Таким образом, вы хотите предотвратить запуск второго экземпляра приложения. Для этого требуется мьютекс. Вам нужно проверить, если мьютекс уже создан, а если нет, то вы его резервируете. Каждый экземпляр вашего приложения выполняет эту проверку, поэтому только первый из них может быть запущен.

Есть хороший пост на эту тему, посмотрите c# - Как правильно создать приложение с одним экземпляром? - переполнение стека[^]

Рейтинг:
2

Member 10850253

Я сделал это в program. cs

public static bool bf = false;
        static void Main()
        {
            foreach (Form form in Application.OpenForms)
            {
                if (form.Name == "BatteryMonitorForm")
                {
                    bf = true;
                    break;
                }
            }
            if (!bf)
            {
                //Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new BatteryMonitorForm());
            }
            else { }
            
            }
            }      

И все равно ничего не получается, я не знаю, что делать.
Не могли бы вы помочь?
Спасибо.


Рейтинг:
0

Maciej Los

Я бы посоветовал почитать последние ответы[^].