У меня есть приложение-загрузчик, которое загружает меню, и когда пользователь нажимает кнопку изображения меню, открывается представление списка на основе текста
(if text = employee)
(Go to class A)
(Go to class B)
...
...
(Show List View Window)
если он снова нажмет на ту же кнопку, она снова откроется, я бы хотел предотвратить это. то есть, но это для приложения WPF





Если вам нужен список открытых форм, то это Application.OpenForms. Вы можете перебрать это, используя GetType () и проверяя .Assembly, чтобы найти их из другой сборки. Кроме того, я не совсем понимаю этот вопрос ...
Assembly currentAssembly = Assembly.GetExecutingAssembly();
List<Form> formsFromOtherAssemblies = new List<Form>();
foreach (Form form in Application.OpenForms) {
if (form.GetType().Assembly != currentAssembly) {
formsFromOtherAssemblies.Add(form);
}
}
Если вы просто хотите отслеживать формы, которые открыли сами, то кешируйте этот экземпляр. Или, если вы используете «собственные формы», вы можете просто проверить по имени:
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);
}
Application.OpenForms вернет 0, т.е. поскольку это загрузчик
Я не уверен, почему ваша основная форма, просто являющаяся загрузчиком, должна влиять на результат здесь ... если среда выполнения знает о форме, она должна появиться в Application.OpenForms - если вы не имеете в виду, что она работает в другом процесс - это то, что Это?
загрузчик не является основной формой, это исполняемый файл, который отображает пользовательский интерфейс (меню) и не знает, что он отображает. поэтому мне нужно получить исполняющуюся сборку, но что тогда? В коде присутствует некоторая абстракция ... можно ли найти открытые формы каким-либо другим способом?
Вы можете использовать шаблон Command. Сборка загрузчика будет искать команды в загруженных сборках. Для каждой команды загрузчик создает элемент меню (или что-то еще, что вы хотите), и событие click запускает конкретную команду.
Команда должна знать, следует ли создавать новую форму или использовать уже существующие.
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;
}
Пожалуйста, создайте приложение WPF и попробуйте это. Я просто пробовал, но не сработало.
Ответ Марка Гарвелла помог мне понять, что я должен делать, но он нуждался в корректировке для 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();
}
}
Что можно было отрегулировать? Новое / текущее окно? Да, просто задайте его свойства.
О верно. Это то, что я сделал для WPF. Я не думаю, что приложение WPF имеет свойство OpenForms, поэтому я переключился на Application.Current.Windows
Еще один простой пример
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;
}
Во-первых, спасибо за ответ. Со ссылкой на ваш первый фрагмент кода. Проблема в Application.OpenForms (не имеет отображаемых форм, это просто загрузчик), а также Assembly currentAssembly = Assembly.GetExecutingAssembly (); выглядит многообещающе ... код должен быть перевернутым ... мммм