WPF-避免重复代码,以防止通过一种方法两次打开同一窗口

问题描述

我有OpenWindow(Window window)显示窗口

 private void OpenWindow(Window window)
        {
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Icon = this.Icon;
            window.Show();
        }

并使用其他一些代码来防止两次进入同一窗口

 private void addStore_Click(object sender,RoutedEventArgs e)
            {
                bool isWindowOpen = false;
                foreach (Window w in Application.Current.Windows)
                {
                    if (w is CompanyWindow)
                    {
                        isWindowOpen = true;
                        w.Activate();
                    }
                }
                if (!isWindowOpen)
                {
                    OpenWindow(new StoresWindow());
                }
            }
    
  private void SotreList_Click(object sender,RoutedEventArgs e)
        {
            bool isWindowOpen = false;
            foreach (Window w in Application.Current.Windows)
            {
                if (w is CompanyWindow)
                {
                    isWindowOpen = true;
                    w.Activate();
                }
            }
            if (!isWindowOpen)
            {
                OpenWindow(new StoreListwindow());
            }
        }

我需要的是如何在OpenWindow()中编写防止两次打开窗口代码

解决方法

为避免重复,可以使用泛型

public void OpenWindow<T> () where T: Window,new() {
        var active = Application.Current.Windows.OfType<Window>().SingleOrDefault(x = >x is T)
        if (active == null) {
            var window = new T();
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Icon = this.Icon;
            window.Show();
        }
        else {
            active.Activate();
        }
    }

用法:

OpenWindow<StoreListWindow>();
,

尝试一下:

 private void OpenWindow(Window window)
        {
            foreach (var w in Application.Current.Windows)
            {
                //If the Types of the Windows match,if (window.GetType() == w.GetType())
                    //Ends the Method
                    return;
            }

            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Icon = this.Icon;
            window.Show();
        }
,

您可以有一个扩展方法,用于在标志打开时设置标志,以及一种用于检查IsOpen的方法。我的意思是Window上的扩展方法。

否则尝试在...上编写一些逻辑。Application.Current.Windows