Nếu bạn thực sự cần phải thực thi một trường hợp duy nhất của một cửa sổ, sau đó một trường hợp tĩnh (một số hương vị của những gì bạn có) với một phương pháp tạo nhà máy chắc chắn là một lựa chọn khả thi, giống như một cá thể DataContext duy nhất khi làm việc với một cơ sở dữ liệu.
Bạn cũng có thể viết lớp WindowManager của riêng mình, mặc dù có vẻ như quá mức cần thiết, và về cơ bản sẽ giống nhau (ngoại trừ phương thức Factory sẽ nằm trong một lớp đơn).
Tuy nhiên, đọc lại bài đăng của bạn, tôi tự hỏi nếu đây là trường hợp thiếu rừng cho cây. Đề cập đến SettingsWindow của bạn, mà lần lượt gọi AccountWindow, làm cho tôi nghĩ rằng bạn chỉ nên sử dụng ShowDialog(). Điều này sẽ mở ra một cửa sổ một cách bình thường, có nghĩa là không thể tương tác với cửa sổ gọi (hoặc bất kỳ cửa sổ nào khác trong ứng dụng của bạn). Bạn chỉ cần đặt thuộc tính trong hộp thoại đó, đặt DialogResult thành true khi nhấn nút OK và đọc thuộc tính đó trong cửa sổ chính.
Về cơ bản, bạn chỉ cần sử dụng ShowDialog như thế này. Tôi bỏ qua rất nhiều chi tiết thực hiện, theo như ràng buộc so với mã hóa cứng để điều khiển. Những chi tiết đó không quan trọng bằng cách chỉ xem cách hoạt động của ShowDialog.
Để đơn giản, giả sử rằng bạn có một lớp được gọi là MyAppOptions, tốt, phản ánh các tùy chọn của ứng dụng của bạn. Tôi sẽ rời khỏi hầu hết các chi tiết thực hiện điều này vì đơn giản, nhưng nó có khả năng sẽ thực hiện INotifyPropertyChanged, có phương pháp và các lĩnh vực và các tài sản vv
public class MyAppOptions
{
public MyAppOptions()
{
}
public Boolean MyBooleanOption
{
get;
set;
}
public String MyStringOption
{
get;
set;
}
}
Sau đó, chúng ta hãy làm đơn giản này, và cho rằng bạn muốn hiển thị hộp thoại Tùy chọn khi bạn nhấn một nút trên một số cửa sổ. Hơn nữa, tôi sẽ giả định rằng có các biến đã được thiết lập với các tùy chọn của bạn, được nạp khi khởi động.
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);
}
}
Bây giờ giả sử rằng OptionsDialog là một cửa sổ bạn đã tạo trong dự án của bạn, và nó có một CheckBox trên nó liên quan đến MyBooleanOption và một TextBox cho MyStringOption. Nó cũng có một nút Ok và một nút Cancel. Mã phía sau có khả năng sẽ sử dụng Binding, nhưng bây giờ chúng tôi sẽ mã hóa các giá trị.
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;
}
}
Đây là ví dụ khá cơ bản về chi tiết triển khai. Tìm kiếm trực tuyến cho ShowDialog để biết thêm chi tiết. Các phím quan trọng cần nhớ là:
- ShowDialog sẽ mở ra một cửa sổ modally, có nghĩa là nó là cửa sổ duy nhất trong ứng dụng của bạn có thể được tương tác với .
- Đặt DialogResult thành true sẽ đóng hộp thoại, có thể được kiểm tra từ cha mẹ gọi.
- Hộp thoại thiết lậpĐối với sai số cũng đóng hộp thoại, trong trường hợp này là , bạn bỏ qua cập nhật giá trị trong cửa sổ gọi .
- Nhấn nút X trên cửa sổ tự động cài đặt DialogResult false
- Bạn có thể có tài sản công cộng trong cửa sổ hộp thoại có thể được thiết lập trước khi thực hiện ShowDialog, và có thể nhận được giá trị từ sau khi hộp thoại biến mất. Nó sẽ có sẵn trong khi hộp thoại vẫn còn trong phạm vi.
Thú vị! Trong trường hợp này, tôi không bỏ lỡ rừng vì tôi hoàn toàn mới.Và hơn nữa, tôi chủ yếu là chương trình công cụ phía máy chủ! Đây là một sân cỏ hoàn toàn mới cho tôi :) Tôi đánh giá cao nếu bạn có thể cập nhật câu trả lời của bạn với một ví dụ! – biasedbit
Cảm ơn ví dụ! : D – biasedbit