Si realmente se necesita para hacer cumplir una sola instancia de una ventana, a continuación, una instancia estática (un poco de sabor de lo que tienes) con un método de creación de fábrica es ciertamente una opción viable, al igual que una sola instancia de DataContext cuando se trabaja con una base de datos.
También podría escribir su propia clase WindowManager, aunque eso parece exagerado, y será esencialmente lo mismo (excepto que los métodos de fábrica estarían en una sola clase).
Sin embargo, al volver a leer su publicación, me pregunto si este es un caso de falta del bosque para los árboles. Al mencionar su SettingsWindow, que a su vez llama a AccountWindow, me hace pensar que simplemente debería usar ShowDialog(). Esto abre una ventana de forma modal, lo que significa que no puede haber interacción con la ventana de llamada (o cualquier otra ventana en su aplicación). Simplemente establece una propiedad en ese diálogo, establece DialogResult en true cuando se presiona el botón Aceptar y lee esa propiedad en la ventana principal.
Básicamente, usted simplemente usa el ShowDialog así. Estoy omitiendo muchos de los detalles de implementación, en lo que respecta a la vinculación frente a la codificación dura de los controles. Esos detalles no son tan importantes como solo ver cómo funciona ShowDialog.
Para simplificar, suponga que tiene una clase llamada MyAppOptions que, bueno, refleja las opciones de su aplicación. Voy a dejar la mayor parte de los detalles de implementación de esto para la simplicidad, pero probablemente llevaría a cabo INotifyPropertyChanged, tienen métodos y campos y propiedades, etc.
public class MyAppOptions
{
public MyAppOptions()
{
}
public Boolean MyBooleanOption
{
get;
set;
}
public String MyStringOption
{
get;
set;
}
}
A continuación, vamos a hacer este sencillo, y asumo que desea mostrar un cuadro de diálogo Opciones cuando presiona un botón en alguna ventana. Además, supondré que hay variables que se han establecido con sus opciones, que se cargaron al inicio.
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);
}
}
Supongamos ahora que el OptionsDialog es una ventana que ha creado en su proyecto, y tiene una casilla en lo relacionado con la MyBooleanOption y un cuadro de texto para MyStringOption. También tiene un botón Aceptar y un botón Cancelar. Es probable que el código subyacente use Binding, pero por ahora codificaremos los valores.
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;
}
}
Este es un ejemplo bastante básico en cuanto a los detalles de implementación. Busque en línea ShowDialog para obtener más detalles. Las claves importantes a tener en cuenta son:
- ShowDialog abre una ventana modal, que significa que es la única ventana de la aplicación que se puede interactuar con .
- Al establecer DialogResult en true se cerrará el cuadro de diálogo, que puede ser marcado por el padre que llama.
- Al establecer DialogResult en false, también cerrará el cuadro de diálogo , en cuyo caso omite la actualización de los valores en la ventana de llamada .
- Al pulsar el botón X en la ventana ajusta automáticamente la DialogResult en false
- Puede tener propiedades públicas en la ventana de diálogo que se pueden establecer antes de hacer el ShowDialog, y puede obtener valores a partir después de que desaparezca el diálogo. Estará disponible mientras el diálogo aún esté en el alcance.
¡Interesante! En este caso, no me falta el bosque para los árboles ya que soy totalmente nuevo.NET y, además, ¡casi siempre programo cosas del lado del servidor! Este es un territorio totalmente nuevo para mí :) Agradecería si pudieras actualizar tu respuesta con un ejemplo. – biasedbit
¡Gracias por el ejemplo! :RE – biasedbit