Получить список экземпляров открытых окон, которые вычитаются из разных сборок

У меня есть приложение-загрузчик, которое загружает меню, и когда пользователь нажимает кнопку изображения меню, открывается список, основанный на тексте

(if text = employee) 
(Go to class A) 
(Go to class B) 
 ...
 ...
 (Show List View Window)

если он снова щелкнет на той же кнопке, что и снова откроется, я хотел бы предотвратить это. но это для приложения WPF

5 ответов

Если вам нужен список открытых форм, то есть Application.OpenForms. Вы можете перебрать это, используя GetType() и проверить .Assembly, чтобы найти те из другой сборки. Помимо этого, я не совсем понимаю вопрос...

Assembly currentAssembly = Assembly.GetExecutingAssembly();
 List<form><code> formsFromOtherAssemblies = new List();
 foreach (Form form in Application.OpenForms) {
 if (form.GetType().Assembly != currentAssembly) {
 formsFromOtherAssemblies.Add(form);
 }
 }
</code>
<p>Если вы просто хотите отслеживать формы, которые вы открыли сами, то кешируйте этот экземпляр. Или, если вы используете "принадлежащие формы", вы можете просто проверить по имени:</p>
<pre class="prettyprint linenums"> private void button1_Click(object sender, EventArgs e) {
 foreach (Form form in OwnedForms) {
 if (form.Name == "Whatever") {
 form.Activate();
 return;
 }
 }
 Form child = new Form();
 child.Name = "Whatever";
 child.Owner = this;
 child.Show(this);
 }


Другой простой пример

private Boolean FindForm(String formName)
 {
 foreach (Form f in Application.OpenForms)
 {
 if (f.Name.Equals(formName))
 {
 f.Location = new Point(POINT.X, POINT.Y + 22);
 return true;
 }
 }
 return false;
 }


NewProduct newproduct;
 private void button1_Click(object sender, EventArgs e)
 {
 if(!isOpened())
 {
 newproduct = new NewProduct();
 newproduct.Show();
 }
 }
 private bool isOpened()
 {
 foreach (Form f in Application.OpenForms)
 {
 if (f == newproduct)
 {
 return true;
 }
 }
 return false;
 }


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

Команда должна знать, следует ли создавать новую форму или использовать уже существующие.


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

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

private void EmployeeMenuItemClick(object sender, RoutedEventArgs e)
{
 bool found = false;
 foreach(Window w in Application.Current.Windows)
 {
 if(w.GetType() == typeof(EmployeeListViewWindow)
 {
 found = true;
 break;
 }
 }
 if(!found)
 {
 EmployeeListViewWindow ew = new EmployeeListViewWindow();
 ew.Show();
 }
}

licensed under cc by-sa 3.0 with attribution.