如果您确实需要强制执行单个窗口实例,那么带有工厂创建方法的静态实例(您所拥有的某种风格)当然是一个可行的选择,就像使用数据库时的单个 DataContext 实例一样.
您也可以编写自己的 WindowManager 类,虽然这看起来有点过头了,而且本质上是一样的(除了 Factory 方法将在一个类中)。
但是,重新阅读您的帖子,我想知道这是否是一个只见树木不见森林的案例。您提到您的 SettingsWindow,而后者又调用 AccountWindow,这让我认为您应该简单地使用 ShowDialog()。这会以模态方式打开一个窗口,这意味着不能与调用窗口(或应用程序中的任何其他窗口)进行交互。您只需在该对话框中设置一个属性,在按下 OK 按钮时将 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 相关的 CheckBox 和一个用于 MyStringOption 的 TextBox。它还有一个确定按钮和一个取消按钮。代码隐藏可能会使用绑定,但现在我们将对值进行硬编码。
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 之前设置的公共属性,并且可以在对话框消失后获取值。当对话框仍在范围内时,它将可用。