如何检测Window已经用完了“ShowDialog”调用

时间:2010-11-14 21:25:43

标签: c# wpf

在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(); } 。但请更多地考虑这个愚蠢的例子。

3 个答案:

答案 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();
    }
}