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

Vac*_*ano 7 c# wpf

在WPF中,您可以ShowDialog在窗口上调用一次.之后就完成了.

对我来说似乎有些蹩脚,但这些都是规则.如果ShowDialog再次拨打电话,则会收到以下异常:

窗口关闭后无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle

我想知道的是:我怎样才能Window(或者UserControl真的)检查它是否已经ShowDialog调用(所以我知道newShowDialog再次呼叫之前要另外一个).

像这样的东西:

public void ShowListOfClients()
{
    //    |  This is the method I want to write
    //    V                                          
    RefreshViewIfNeeded(_myWindowOrUserControlThatShowsAList);

    FillWindowWithBusinessData(_myWindowOrUserControlThatShowsAList);
    _myWindowOrUserControlThatShowsAList.ShowDialog();

}
Run Code Online (Sandbox Code Playgroud)

注意:显然在上面的例子中,WindowOrUserControlThatShowsAList每次进入方法时都会更容易创建一个新的.但请更多地考虑这个愚蠢的例子.

Han*_*ant 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

下一个是明确跟踪对象引用的运行状况:

    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();
    }
Run Code Online (Sandbox Code Playgroud)