#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