【问题标题】:reloaded wpf window重新加载wpf窗口
【发布时间】:2010-11-10 22:09:11
【问题描述】:

我有主 wpf 窗口,在这个窗口中我创建新的从属窗口并添加字典。有可能,关闭从属窗口后,又出现了。

public class MainWindow:Window
{
private dictionary<string, SlaveWindow> _winDic= new dictionary<string, SlaveWindow>();

public void SomeMethod()
{

var mySlaveWindow = new SlaveWindow();
//add to dictionary
_winDic.Add("mySlaveWindow",w);

//close slave window w


//show
_winDic[mySlaveWindow].Show();
}
}

【问题讨论】:

    标签: c# wpf window


    【解决方案1】:

    以下方法取自this msdn 页面。

    订阅 Window 的 Closing 事件并将其添加到后面的代码中。

    private bool m_close = false;
    // Shadow Window.Close to make sure we bypass the Hide call in 
    // the Closing event handler
    public new void Close()
    {
        m_close = true;
        base.Close();
    }
    private void Window_Closing(object sender, CancelEventArgs e)
    {
        // If Close() was called, close the window (instead of hiding it)
        if (m_close == true)
        {
            return;
        }
        // Hide the window (instead of closing it)
        e.Cancel = true;
        this.Hide();
    }
    

    这将确保您的窗口最终关闭并且不会挂起。

    【讨论】:

    • 一些问题:1)我不明白为什么只有其中一个使用 Dispatcher.BeginInvoke - 如果第一个需要它,第二个示例是否也需要它? 2) 您的第二个示例不应该调用 base.OnClosing,以及 3) 使用 Visibility 而不是 Hide() 有什么好处,后者更能描述正在做的事情?
    • 好问题。我自己没有编写该代码,但我相信使用 Dispatcher.BeginInvoke 是为了避免“InvalidOperationException - 设置可见性,或在窗口关闭时调用 Show、ShowDialog 或 Close”从这里 msdn.microsoft.com/en-us/library/…。同意, Hide() 更具描述性。我还更新了对此链接中 Microsoft 推荐内容的回答。 msdn.microsoft.com/en-us/library/cc656741(VS.90).aspx
    【解决方案2】:

    您需要隐藏窗口而不是关闭它。

    如果您调用Hide(),窗口会像您调用Close() 时一样消失,但您稍后可以再次调用Show() 重新显示它。

    【讨论】:

    • 是的 - 我对这个问题的解释有点过于字面意思了。我将代码中的注释“关闭从属窗口 w”表示他打算从代码中关闭窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多