窗户管理 - 开放,关闭和重新开放非模态形式?

时间:2014-08-06 14:17:34

标签: c# wpf windows non-modal

在伪代码中,这是我试图从主窗口做的,有许多非模态子窗口可以独立于主窗口打开和关闭。 (想想"偏好"或"发现")

按下" OPEN WINDOW"
步骤1:如果窗口不存在,请创建窗口 第2步:窗口现在存在,所以将它带到前面和后面。让它可见。
(如果在窗口已经打开的情况下按下OPEN WINDOW,则步骤2为NB - 我不想要它的多个实例,只需将它带到前面。)

按下" CLOSE WINDOW"
第3步:关闭窗口
ALT STEP 3:隐藏窗口

这是我尝试过的代码。如果能够打开窗户,如果在窗户打开时再次按下OPEN WINDOW,我会把它带到前面。但是,一旦我关闭窗户,我就无法再次打开窗户。我收到一个错误,指出窗口关闭后无法使用Window.Show()。

public static void OpenWindowOnce(Window windowToOpen)
    {
        foreach (Window n in Application.Current.Windows)
        {
            //Checks if the window is already open, and brings it to the front if it is
            if (n.GetType() == windowToOpen.GetType())
                {}                    
            else
                {  windowToOpen.Show(); }
        }

        windowToOpen.Activate();
    }

我的代码/逻辑在哪里出错了?谢谢,我对编码很陌生,并花了数周时间试图做到这一点。

1 个答案:

答案 0 :(得分:0)

您不能使用已关闭的Window,因为此时资源已被处理。解决方案是每次要显示一个新的Window

我可以看到你传入一个Window对象,然后试图找到特定类型的Window ...在这种情况下,你可以使用反射来实例化你的Window来自他们的Type。特别是,请参阅MSDN上的Activator.CreateInstance Method页面。你可以使用这样的东西:

public static void OpenWindowOnce(Window windowToOpen)
{
    foreach (Window n in Application.Current.Windows)
    {
        //Checks if the window is already open, and brings it to the front if it is
        if (n.GetType() == windowToOpen.GetType()) { ... }
        else
        {
            windowToOpen = Activator.CreateInstance(typeof(YourWindow)) as YourWindow;
            windowToOpen.Show(); 
        }
    }
    windowToOpen.Activate();
}