代码之家  ›  专栏  ›  技术社区  ›  Vaccano

如何检测窗口已用完其“ShowDialog”调用

  •  7
  • Vaccano  · 技术社区  · 14 年前

    在WPF中你可以打电话 ShowDialog 就在一扇窗户上。在那之后就结束了。

    在我看来有点蹩脚,但这就是规则。如果你打电话 显示对话框 再次出现此异常:

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

    我想知道的是:我怎么能 Window (或 UserControl 真的)看看它是否 显示对话框 打过电话(所以我知道 new 打电话之前换个地方 显示对话框 再次)。

    像这样的:

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

    注: 显然在上面的例子中,创建一个新的 WindowOrUserControlThatShowsAList 每次我进入方法。但是,请考虑这个问题,而不是简单的例子。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Hans Passant    14 年前

    这不是ShowDialog()独有的,Show()也会这样做。不,没有要检查的IsDisposed属性。IsLoaded只是半个解决方案,第一次调用时也是false。

    第一种方法是创建一个可以重新显示的对话框:

        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();
        }
    
        2
  •  3
  •   Guy    14 年前

    好吧,做这件事的肮脏方法就是抓住例外。

    简单的方法是用ShowDialog显示一个窗口,并在函数返回时销毁(丢失对窗口的引用等)。视图不应该与模型紧密耦合(您使用的是MVVM对吗?)因此,为每个客户机视图创建新的可视对象不应该是一个问题。

        3
  •  0
  •   Jonat    13 年前

    处理此问题的简单方法,而无需搞乱闭幕式:

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