在WPF中,您只需在窗口上调用一次ShowDialog
即可。之后就完成了。
对我来说似乎有点蹩脚,但这些都是规则。如果再次致电ShowDialog
,则会遇到以下异常:
窗口关闭后无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle
我想知道的是:我如何才能Window
(或UserControl
真的)并检查它是否已调用ShowDialog
(所以我知道{{在再次调用new
之前,先添加另一个。)
这样的事情:
ShowDialog
注意:显然,在上面的示例中,每次输入方法时都会更容易创建新的public void ShowListOfClients()
{
// | This is the method I want to write
// V
RefreshViewIfNeeded(_myWindowOrUserControlThatShowsAList);
FillWindowWithBusinessData(_myWindowOrUserControlThatShowsAList);
_myWindowOrUserControlThatShowsAList.ShowDialog();
}
。但请更多地考虑这个愚蠢的例子。
答案 0 :(得分:9)
这不是ShowDialog()独有的,Show()也是如此。不,没有IsDisposed属性可供检查。 IsLoaded只是解决方案的一半,对于第一次调用也是错误的。
第一种方法是创建一个可以重新显示的对话框:
public bool CloseAllowed { get; set; }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
if (!CloseAllowed) {
this.Visibility = System.Windows.Visibility.Hidden;
e.Cancel = true;
}
}
下一个是明确跟踪对象引用的健康状况:
private Window1 win = new Window1(); // say
private void button1_Click(object sender, RoutedEventArgs e) {
if (win == null) {
win = new Window1();
win.Closing += delegate { win = null; };
}
win.ShowDialog();
}
答案 1 :(得分:3)
肮脏的方法就是捕捉异常。
干净的方法是显示一个带有ShowDialog的窗口,并在函数返回时销毁(丢失引用等)窗口。视图不应该与模型紧密耦合(您正在使用MVVM吗?)因此,为每个客户端视图创建新的可视对象应该不是问题。
答案 2 :(得分:0)
轻松解决此问题的方法,而不会搞乱Closing事件:
public partial class MainWindow
{
private SomeCustomWindow _someCustomWindow;
public MainWindow()
{
InitializeComponent();
}
private void OnOpenCustomWindowButtonClick(object sender, RoutedEventArgs e)
{
if (_someCustomWindow != null)
_someCustomWindow.Close();
_someCustomWindow = new SomeCustomWindow();
_someCustomWindow.ShowDialog();
}
private void OnWindowClosing(object sender, CancelEventArgs e)
{
if (_someCustomWindow!= null)
_someCustomWindow.Close();
}
}