Получить список экземпляров форм открытых окон, которые выполняются из другой сборки - PullRequest
4 голосов
/ 23 декабря 2008

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

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

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

Ответы [ 5 ]

11 голосов
/ 23 декабря 2008

Если вы хотите список открытых форм, то есть 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);
    }
2 голосов
/ 30 апреля 2014

Еще один простой пример

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;
    }
2 голосов
/ 25 марта 2009
    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;
    }
0 голосов
/ 02 августа 2010

Ответ Марка Гарвелла помог мне понять, что я должен делать, но для этого нужно было настроить 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();
    }
}
0 голосов
/ 23 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...