Если вам действительно необходимо применить один экземпляр окна, то статический экземпляр (немного похожий на то, что у вас есть) с помощью метода создания фабрики, безусловно, является приемлемым вариантом, очень похожим на один экземпляр DataContext при работе с базой данных..
Вы также можете написать свой собственный класс WindowManager, хотя это кажется излишним, и по сути это будет то же самое (за исключением того, что методы Factory будут в одном классе).
Однако,перечитывая твой пост, мне интересно, если это случай пропустить лес за деревьями.Ваше упоминание вашего SettingsWindow, которое в свою очередь вызывает AccountWindow, заставляет меня думать, что вы должны просто использовать ShowDialog ().Это открывает окно модально, что означает, что не может быть никакого взаимодействия с вызывающим окном (или любым другим окном в вашем приложении).Вы просто устанавливаете свойство в этом диалоговом окне, устанавливаете DialogResult в true при нажатии кнопки ОК и читаете это свойство в родительском окне.
По сути, вы просто используете ShowDialog, как это.Я опускаю много деталей реализации, в том числе связывание и жесткое программирование для элементов управления.Эти детали не так важны, как просто просмотр работы ShowDialog.
Для простоты предположим, что у вас есть класс MyAppOptions, который, в общем-то, отражает параметры вашего приложения.Я оставлю большинство деталей реализации этого для простоты, но он, вероятно, будет реализовывать INotifyPropertyChanged, иметь методы, поля и свойства и т. Д.
public class MyAppOptions
{
public MyAppOptions()
{
}
public Boolean MyBooleanOption
{
get;
set;
}
public String MyStringOption
{
get;
set;
}
}
Затем давайте сделаем это простым и предположим, что выхотите показать диалог настроек, когда вы нажимаете кнопку в каком-то окне.Кроме того, я предполагаю, что есть переменные, которые были установлены с вашими параметрами, которые были загружены при запуске.
void btnOptions_Click(object sender, RoutedEventArgs e)
{
MyAppOptions options = new MyAppOptions();
options.MyBooleanOption = mSomeBoolean;
options.MyStringOption = mSomeString;
OptionsDialog optionsDialog = new optionsDialog(options);
if (optionsDialog.ShowDialog() == true)
{
// Assume this function saves the options to storage
// and updates the application (binding) appropriately
SetAndSaveOptions(optionsDialog.AppOptions);
}
}
Теперь предположим, что OptionsDialog - это окно, которое вы создали в своем проекте, и оноимеет флажок, связанный с MyBooleanOption и TextBox для MyStringOption.Он также имеет кнопку ОК и кнопку Отмена.Кодовая часть, скорее всего, будет использовать Binding, но сейчас мы жестко закодируем значения.
public class OptionsDialog : Window
{
public OptionsDialog(MyAppOptions options)
{
chkBooleanOption.IsChecked = options.SomeBooleanOption;
txtStringOption.Text = options.SomeStringOption;
btnOK.Click += new RoutedEventHandler(btnOK_Click);
btnCancel.Click += new RoutedEventHandler(btnCancel_Click);
}
public MyAppOptions AppOptions
{
get;
set;
}
void btnOK_Click(object sender, RoutedEventArgs e)
{
this.AppOptions.SomeBooleanOption = (Boolean) chkBooleanOption.IsChecked;
this.AppOptions.SomeStringOption = txtStringOption.Text;
// this is the key step - it will close the dialog and return
// true to ShowDialog
this.DialogResult = true;
}
void btnClose_Click(object sender, RoutedEventArgs e)
{
// this will close the dialog and return false to ShowDialog
// Note that pressing the X button will also return false to ShowDialog
this.DialogResult = false;
}
}
Это довольно простой пример с точки зрения деталей реализации.Поиск онлайн для ShowDialog для получения дополнительной информации.Важные ключи, которые нужно запомнить:
- ShowDialog открывает окно модально, то есть это единственное окно в вашем приложении, с которым можно взаимодействовать.
- Если для DialogResult задано значение true, диалоговое окно закроется, что можно проверить из вызывающего родителя.
- Если для DialogResult установлено значение false, диалоговое окно также будет закрыто. В этом случае вы пропускаете обновление значений в вызывающем окне.
- Нажатие кнопки X в окне автоматически устанавливает для DialogResult значение false
- Вы можете иметь открытые свойства в диалоговом окне, которые можно установить перед выполнением ShowDialog, и получать значения последиалог исчезает.Он будет доступен, пока диалог находится в области видимости.