Как избежать нескольких экземпляров формы Windows в c #

Как избежать нескольких экземпляров формы Windows в c #? Мне нужен только один экземпляр формы. Потому что есть вероятность открыть одну и ту же форму со многих страниц моего приложения.

реализовать шаблон Singleton

пример: CodeProject: Simple Singleton Forms (хорошо, это в VB.NET, но просто для того, чтобы дать вам ключ)

Да, у него есть одноэлементный узор,

Код для создания одноэлементного объекта,

public partial class Form2 : Form { ..... private static Form2 inst; public static Form2 GetForm { get { if (inst == null || inst.IsDisposed) inst = new Form2(); return inst; } } .... } 

Invoke / Показать эту форму,

 Form2.GetForm.Show(); 

Когда вы показываете диалог, просто используйте .ShowDialog(); вместо .Show();

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

  private bool checkWindowOpen(string windowName) { for (int i = 0; i < Application.OpenForms.Count; i++) { if (Application.OpenForms[i].Name.Equals(windowName)) { Application.OpenForms[i].BringToFront(); return false; } } return true; } 

windowName - это, по сути, имя classа вашей формы Windows, а возвращаемое значение может использоваться для создания нового экземпляра формы.

Если ваша система имеет возможность показывать один и тот же тип формы для разных данных экземпляра, вы можете создать систему проверки, которая выполняет итерацию всех существующих открытых форм, ищет уникальный идентификатор данных экземпляра, а затем повторно отображает любую найденную форму.

например, имея class формы «CustomerDetails», который содержит общедоступное свойство «CustomerUniqueID»:

 foreach(Form f in CurrentlyDisplayedForms) { CustomerDetails details = f as CustomerDetails; if((details != null) && (details.CustomerUniqueUD == myCustomerID)) { details.BringToFront(); } else { CustomerDetails newDetail = new CustomerDetails(myCustomerID); } } 

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

Вот мое решение в ShowForm ():

  private void ShowForm(Type typeofForm, string sCaption) { Form fOpen = GetOpenForm(typeofForm); Form fNew = fOpen; if (fNew == null) fNew = (Form)CreateNewInstanceOfType(typeofForm); else if (fNew.IsDisposed) fNew = (Form)CreateNewInstanceOfType(typeofForm); if (fOpen == null) { fNew.Text = sCaption; fNew.ControlBox = true; fNew.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; fNew.MaximizeBox = false; fNew.MinimizeBox = false; // for MdiParent //if (f1.MdiParent == null) // f1.MdiParent = CProject.mFMain; fNew.StartPosition = FormStartPosition.Manual; fNew.Left = 0; fNew.Top = 0; ShowMsg("Ready"); } fNew.Show(); fNew.Focus(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { ShowForm(typeof(FAboutBox), "About"); } private Form GetOpenForm(Type typeofForm) { FormCollection fc = Application.OpenForms; foreach (Form f1 in fc) if (f1.GetType() == typeofForm) return f1; return null; } private object CreateNewInstanceOfType(Type typeofAny) { return Activator.CreateInstance(typeofAny); } public void ShowMsg(string sMsg) { lblStatus.Text = sMsg; if (lblStatus.ForeColor != SystemColors.ControlText) lblStatus.ForeColor = SystemColors.ControlText; } 

проверьте эту ссылку :

 using System; public sealed class Singleton { private static volatile Singleton instance; private static object syncRoot = new Object(); private Singleton() {} public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new Singleton(); } } return instance; } } } 

Попробуйте этот код

 Public class MyClass { //Create a variable named public static int count = 0; //Then increment count variable in constructor MyClass() { count++; } } 

При создании объекта для вышеуказанного classа «MyClass» проверьте значение счетчика больше 1

 class AnotherClass { public void Event() { if(ClassName.Count <= 1) { ClassName classname=new ClassName(); } } } 

Вот простой способ сделать это.

Проверьте, является ли форма нулевой или удалена. Если это правда, мы создаем новый экземпляр формы.

В противном случае мы просто покажем уже запущенную форму.

  Form form; private void btnDesktop_Click(object sender, EventArgs e) { if (form == null || desktop.IsDisposed) { form = new Form(); form.Show(); } else { form.WindowState = FormWindowState.Normal; } } 

Синглтоны не являются объектно-ориентированными. Это просто объектная версия глобальных переменных. Вы можете сделать конструктор classа Form частным, поэтому никто не может случайно создать один из них. Затем вызовите reflection, преобразуйте ctor в общеansible и убедитесь, что вы создали один и только один экземпляр.

Вы можете проверить существующие процессы до открытия формы:

 using System.Diagnostics; bool ApplicationAlreadyStarted() { return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length == 0; } 

Я не знаю, влияет ли метод GetProcessesByName на UAC или другие меры безопасности.

Interesting Posts
Давайте будем гением компьютера.