【问题标题】:Hide an Instance of a Window隐藏窗口的实例
【发布时间】:2019-07-18 07:38:06
【问题描述】:

如何将在一个方法中创建的窗口实例隐藏在另一个方法中?

我有一个带有“注册”按钮的登录窗口,当您单击该按钮时,注册窗口正在打开,而登录窗口正在隐藏(工作正常)。 现在的问题是,我在注册窗口上有一个“返回”按钮,它应该隐藏注册窗口并显示登录窗口。 我可以显示登录窗口:“Application.Current.MainWindow.Show();”,但我不知道如何隐藏注册窗口。通常我只会选择“Regis.Hide()”,但我不能这样做,因为我在方法中有 Regis 的实例,它会打开注册窗口。

我明白,如果我在第二个方法中创建第二个实例并隐藏它,那将不起作用,因为现在有 2 个单独的实例。 但正如我所说,我也不知道该怎么做。

OpenRegistrationGui:

ICommand _RegisterBack;
public void Open()
{
    Application.Current.MainWindow.Hide();
    Register regis = new Register();
    regis.Show();
}

public ICommand RegisBackCommand
    {
        get
        {
            if (_RegisterBack == null)
            {
                _RegisterBack = new RelayCommand(
                    param => Back()
                    );
            }
            return _RegisterBack;
        }
    }

public void Back()
{
    Application.Current.MainWindow.Show();
    //I Want to Hide the Regis here, but i cant use the Instance from above.
}

MyViewModel:

OpenRegistrierungsGUI RegisGUI = new OpenRegistrierungsGUI();
public ICommand RegisBack
    {
        get => RegisGUI.RegisBackCommand;
        set => RegisBack = RegisGUI.RegisBackCommand;
    }

Open() 方法也是如此。

我想要的结果只是注册窗口隐藏并且登录窗口显示出来。

【问题讨论】:

    标签: c# wpf instance show-hide


    【解决方案1】:

    这将通过使regis 成为整个类都可以访问的成员变量来解决您的问题...

    private Register regis;
    
    public void Open()
    {
        Application.Current.MainWindow.Hide();
    
        // Create the register window, if it doesn't exist
        if (regis == null)
        {
            regis = new Register();
        }
    
        regis.Show();
    }
    
    public void Back()
    {
        // hide the register window, if it exists
        if (regis != null)
        {
            regis.Hide();
        }
    
        Application.Current.MainWindow.Show();
    }
    

    有不同的方法可以做到这一点,但这种方法只确保注册窗口的一个实例,并为您提供所需的显示/隐藏功能。

    【讨论】:

    • 首先感谢您的快速答复。但可悲的是,当我这样做时,当方法 Back() 触发时,我得到了 System.NullReferenceException。 regis 的值为 null。
    • 我假设Back() 只会在显示注册表单后触发。我将在那里添加第二个空检查以进行完整性检查。
    • 你是对的,Back() 只能在显示注册后触发。该按钮仅存在于表单注册中。 Null 检查是完美的,但它仍然不会隐藏注册表。
    • 在这种情况下,其他事情会阻止此工作,因为该代码应该可以正常工作。是否只有一个类实例具有Open()Back() 方法,它们是如何调用的?另外,Regis 真的是 Windows 窗体吗?
    • 是的,只有一个注册实例。注册不是WinForms,它的WPF和regis只是Instance的名字。
    【解决方案2】:

    只需使用 regis.hide(); 希望它对您有用。

    private Register regis;
     public void Back()
            {
            Application.Current.MainWindow.Show();
            regis.hide();
            }
    

    这里你想将一个函数变量用于另一个函数变量

    【讨论】:

    • regis 仅存在于 Open() 方法中,因为那是它被声明的地方。该方法之外的任何人都不知道该变量。
    • 嗨,Archer,请投票给我,我改进了我的格式。
    • 它对我不起作用,当 Back() 触发时,我在 regis 上得到一个 SystemNullReferenceException。
    【解决方案3】:

    全局声明 regis,而不是在第一次使用它的方法中对其进行初始化。

    这样就只有一个 regis 实例了。

    现在你可以做

    regis.Hide()
    

    regis.Show()
    

    在你班级的任何方法中

    【讨论】:

      【解决方案4】:

      我找到了解决办法:

      我触发了 Open() 方法(效果很好)。 当我想触发 Back() 方法时,我不小心创建了一个“OpenRegistrationGui”实例并试图关闭它,它显然不能,因为它是另一个实例。 我将属性“RegisBackCommand”设为静态,现在直接从 ViewModel 中触发它,它现在可以工作了。

      无论如何...谢谢大家的快速解答和帮助!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多