Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在表单C和Winforms之间转换?_C#_Forms_Winforms_User Interface_Panel - Fatal编程技术网

C# 如何在表单C和Winforms之间转换?

C# 如何在表单C和Winforms之间转换?,c#,forms,winforms,user-interface,panel,C#,Forms,Winforms,User Interface,Panel,这似乎是一个相当明显且非常新的问题(事实确实如此),但我只是尝试在C#Winforms中的多个表单之间进行转换,并以某种方式遇到了许多复杂问题: 首先,我使用了显而易见的: 但是,每次运行此代码时,都会使用hub.Close()创建一个新的frm_hub实例;无法工作,因为它没有关闭frm_hub的同一个新实例 是否有一种方法可以从不同的表单(例如使用全局变量)关闭相同的表单实例?或者是否有某种方法集成Close();所以整个程序继续运行,新的表单显示 作为上述问题的可能解决方案,我尝试将相

这似乎是一个相当明显且非常新的问题(事实确实如此),但我只是尝试在C#Winforms中的多个表单之间进行转换,并以某种方式遇到了许多复杂问题:

  • 首先,我使用了显而易见的:
  • 但是,每次运行此代码时,都会使用hub.Close()创建一个新的frm_hub实例;无法工作,因为它没有关闭frm_hub的同一个新实例

    • 是否有一种方法可以从不同的表单(例如使用全局变量)关闭相同的表单实例?或者是否有某种方法集成Close();所以整个程序继续运行,新的表单显示
  • 作为上述问题的可能解决方案,我尝试将相同的表单存储为变量:
  • 但是,当我尝试使用相同的策略将表单存储为两个表单中的变量时,出现了运行时错误:“System.StackOverflowException:”抛出了类型为“System.StackOverflowException”的异常

    • 为什么会发生这种错误?我有什么办法克服它吗
  • 最后,在阅读一些针对这个问题的文章时,我发现了控件和面板的用法,通过这种方式,我可以创建一个界面,在面板中打开不同的窗体
  • 然而,我的尝试需要使用锚来远程显示符合设计者外观的表单

    • 如果我不要求表单可以调整大小,那么如何使用面板来显示不同的表单,并以显示设计元素的方式显示它们的位置
    再次为我对术语的初学者理解和使用表示歉意,请随时寻求澄清我可能没有包括的关键细节哈哈,
    谢谢大家!

    我使用了以下方法,不确定这是最佳实践。我使用了一个按钮
    ShowFrmHubButton
    ,并在窗口已经显示时将其禁用

    在我的示例中,第二个窗体是模态的,只要显示第二个窗口,就不能使用第一个窗口

    ShowFrmHubButton.IsEnabled=false;
    var frmHubWindow=新的frm_中心()
    {
    所有者=此
    };
    frmHubWindow.ShowDialog();
    showfrmhubbuton.IsEnabled=true;
    

    然后,当您关闭\取消第二个表单时,使用
    this.close()

    StackOverflowException表明您很可能在
    frm\U hub
    内部创建了一个
    frm\U hub
    的实例(希望您能看到问题所在)。无论如何,如果您想在多个文件中访问表单,那么您应该在一个地方创建一个
    公共静态
    变量/属性,并仅使用该属性。或者,您可以使用
    Application.OpenForms.OfType().FirstOrDefault()
    获取表单当前打开的实例。非常感谢!在公众面前创造了奇迹,哈哈。作为一个有趣的问题(出于美学考虑),您是否知道一种方法来消除.Show()和Close()之间的剧烈转换。在第二个表单的Close()之前,我尝试了一个Thread.Sleep(50),但是仍然出现了一个闪光。使用.ShowDialog()可以进行更平滑的转换,但是使用公共静态表单和.Close()似乎不起作用,因为.Close()在运行.ShowDialog()之前退出表单。如果没有,不用担心,再次感谢您!你好!非常感谢您提供此解决方案!不幸的是,更大的问题是,当我导航到frm_hub时,如果我在另一个表单中,我希望我当前所在的表单将关闭,然后显示frm_hub.ShowDialog()-但此顺序不起作用,因为它要么在显示另一个表单之前关闭表单,或者,由于对话框的性质,它根本没有关闭原始表单(这意味着在对话框关闭后代码才会执行)。你知道怎么解决吗?谢谢我可能会:既然您声明了一个所有者,那么就可以使用
    var parent=owner作为主窗口parent.Hide()请注意,您不能使用
    parent.Close()
    ,因为它拥有frmHubWindow,我认为您不能在构造函数中使用它。(我再次郑重感谢您的帮助)嗯,是的,当然,尽管问题随后会通过say parent.ShowDialog()重新显示出来由于每次都会打开一个新对话框,所以如果用户选择继续打开,我会得到大约10个实例,但是除非使用.Close(),否则showdialog不会重新打开哦,天哪,哈哈哈,你希望用户能够显示多个frm_中心吗?是否需要同时显示两个窗口?嗯,不,我不希望,基本上,当单击中心导航按钮时,我希望显示中心窗体,但这是一个更平滑的过渡(仅使用frm_hub.show()会产生奇怪的闪烁),我希望关闭用户所在的当前窗体(这样就不会打开多个实例)。但是,出于某种原因使用.Hide()会导致表单的多个实例保持打开状态(因为每次按钮事件发生时都会调用var frmHubWindow=new frm_hub(),因此每次都会创建一个新的frmHubWindow)
    frm_hub hub = new frm_hub();
    hub.Show();
    
    frm_hub hub = new frm_hub();
    private void OpenForm()
    {
        hub.Show()
    }