WPF — Избегайте повторяющихся кодов, чтобы предотвратить повторное открытие одного и того же окна одним методом

#c# #wpf #performance #oop #code-reuse

#c# #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() ?

Комментарии:

1. Вы уже сделали это с открытым вашим IsWindow? Не так ли?

2. Да, это сработало, но я не хочу, чтобы дублировались. 🙂

3. Я бы также предложил попробовать некоторые MVVM и команды вместо обработчиков щелчков — вы заблудитесь с большим количеством окон и кнопок

Ответ №1:

Попробуйте это:

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

Комментарии:

1. хорошее решение, но не оптимальное. Новые объекты window будут созданы просто для проверки, существуют ли они.

2. другим вариантом было бы добавить общедоступный статический bool к пользовательским оконным классам, установить для bool значение true в конструкторе и значение false в деконструкторе. Затем проверьте, является ли значение false перед созданием окна.

3. Я попробовал это, но окно не открылось, и программа не остановится после закрытия главного окна.

Ответ №2:

Чтобы избежать дубликатов, вы можете использовать дженерики

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

Комментарии:

1. Спасибо за ответ, но я получил эту ошибку: Не удается создать экземпляр переменной типа ‘T’, потому что у нее нет ограничения new(). в этой строке кода var window = new T();

2. Еще раз спасибо, я нашел проблему, добавив new() ограничение после окна: public void OpenWindow<T>() where T : Window, new()

3. @Dlear Ahmad извините, я напечатал это без IDE.

4. Большое спасибо, не нужно извиняться, с уважением.

Ответ №3:

У вас может быть метод расширения для установки флага всякий раз, когда он открыт, и метод проверки isOpen. Я имею в виду методы расширения в окне.

Или попробуйте написать какую-нибудь логику…. Приложение.Текущий.Windows