Get list of open windows form instance that are ex

2019-01-19 05:50发布

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

5条回答
手持菜刀,她持情操
2楼-- · 2019-01-19 06:31

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;
    }
查看更多
Summer. ? 凉城
3楼-- · 2019-01-19 06:38

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();
    }
}
查看更多
爷的心禁止访问
4楼-- · 2019-01-19 06:44

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楼-- · 2019-01-19 06:48
    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;
    }
查看更多
唯我独甜
6楼-- · 2019-01-19 06:54

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);
    }
查看更多
登录 后发表回答