Si vous avez vraiment besoin d'appliquer une seule instance d'une fenêtre, puis une instance statique (un peu de saveur de ce que vous avez) Avec une méthode de création d'usine est certainement une option viable, un peu comme une seule instance DataContext lorsque vous travaillez avec une base de données.
Vous pouvez également écrire votre propre classe WindowManager, bien que cela semble être trop, et sera essentiellement la même chose (sauf que les méthodes Factory seraient dans une seule classe). Cependant, en relisant votre message, je me demande s'il s'agit d'un cas de disparition de la forêt pour les arbres. Votre mention de votre Windows SettingsWindow, qui à son tour appelle AccountWindow, me fait penser que vous devriez simplement utiliser ShowDialog(). Cela ouvre une fenêtre de façon modale, ce qui signifie qu'il ne peut y avoir d'interaction avec la fenêtre d'appel (ou toute autre fenêtre de votre application). Vous définissez simplement une propriété dans cette boîte de dialogue, définissez DialogResult sur true lorsque le bouton OK est enfoncé et lisez cette propriété dans la fenêtre parente.
Fondamentalement, vous utilisez simplement le ShowDialog comme ceci. Je laisse de côté beaucoup de détails sur l'implémentation, en ce qui concerne la liaison et le codage en dur des contrôles. Ces détails ne sont pas aussi importants que de voir comment fonctionne ShowDialog. Par simplicité, supposons que vous avez une classe appelée MyAppOptions qui, bien, reflète les options de votre application. Je partirai de la plupart des détails de mise en œuvre de cette situation pour la simplicité, mais il serait probablement mettre en œuvre INotifyPropertyChanged, ont des méthodes et des champs et des propriétés, etc.
public class MyAppOptions
{
public MyAppOptions()
{
}
public Boolean MyBooleanOption
{
get;
set;
}
public String MyStringOption
{
get;
set;
}
}
Ensuite, nous allons faire ce simple, et je suppose que vous voulez affiche une boîte de dialogue Options lorsque vous appuyez sur un bouton dans une fenêtre. En outre, je vais supposer qu'il existe des variables qui ont été définies avec vos options, qui ont été chargées au démarrage.
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);
}
}
Supposons maintenant que la OptionsDialog est une fenêtre que vous avez créé dans votre projet, et il a une CheckBox sur elle liée à MyBooleanOption et une zone de texte pour MyStringOption. Il a également un bouton Ok et un bouton Annuler. Le code-behind utilisera probablement Binding, mais pour le moment nous allons coder les valeurs.
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;
}
}
Ceci est un exemple assez basique en ce qui concerne les détails d'implémentation. Recherche en ligne pour ShowDialog pour plus de détails. Les clés importantes à retenir sont:
- ShowDialog ouvre une fenêtre de façon modale, ce qui signifie qu'il est la seule fenêtre dans votre application qui peut être interagi avec .
- La définition de DialogResult sur ferme la boîte de dialogue, qui peut être vérifiée depuis le parent appelant.
- La définition de DialogResult sur false fermera également la boîte de dialogue , auquel cas vous ignorerez la mise à jour des valeurs dans la fenêtre d'appel .
- En appuyant sur la touche X sur la fenêtre définit automatiquement les DialogResult false
- Vous pouvez avoir des propriétés publiques dans la fenêtre de dialogue qui peuvent être définies avant de faire le ShowDialog, et peut obtenir des valeurs de après la boîte de dialogue disparaît. Il sera disponible tant que la boîte de dialogue est toujours dans la portée.
Intéressant! Dans ce cas, je ne manque pas la forêt pour les arbres puisque je suis totalement nouveau à.NET et de plus, je programme surtout des trucs côté serveur! C'est un tout nouveau terrain pour moi :) J'apprécierais si vous pouviez mettre à jour votre réponse avec un exemple! – biasedbit
Merci pour l'exemple! :RÉ – biasedbit