Get list of open windows form instance that are excuted from different assembly

岁酱吖の 提交于 2019-11-27 06:20:49

问题


I have a 'loader app' that loads a menu and when user clicks the menu image button a list view opens based on the text

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

if he clicks again on the same button it opens again, I would like to prevent this. i.e but this for a WPF application


回答1:


If you want a list of the open forms, that is Application.OpenForms. You could iterate over this, using GetType() and checking the .Assembly to find those from a different assembly. Beyond that, I'm not entire clear on the question...

        Assembly currentAssembly = Assembly.GetExecutingAssembly();
        List<Form> formsFromOtherAssemblies = new List<Form>();
        foreach (Form form in Application.OpenForms) {
            if (form.GetType().Assembly != currentAssembly) {
                formsFromOtherAssemblies.Add(form);
            }
        }

If you just want to track forms you have opened yourself, then cache that instance. Or if you use "owned forms", you can just check by name:

    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:


    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;
    }



回答3:


Another simple example

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;
    }



回答4:


You can use a Command pattern. The loader assembly will search for commands in loaded assemblies. For every command the loader create menu item ( or anything else, you want ), and click event will run the concrete command.

The command must know if should be created new form or used some already existing.




回答5:


Mark Garvell's answer helped me to figure out what I should do, but it needed adjusting for WPF.

(In my case I wanted to close any windows not owned by the main one when it closes, but the principle is the same.)

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();
    }
}


来源:https://stackoverflow.com/questions/388859/get-list-of-open-windows-form-instance-that-are-excuted-from-different-assembly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!