如何在 C# Winforms 表单之间转换?
Posted
技术标签:
【中文标题】如何在 C# Winforms 表单之间转换?【英文标题】:How do I transition between forms C# Winforms? 【发布时间】:2021-04-15 10:22:27 【问题描述】:这似乎是一个相当明显且非常新人的问题(确实如此),但我只是试图在 C# Winforms 中的多种形式之间进行转换,并且不知何故遇到了许多复杂情况:
-
首先,我使用了明显的:
frm_hub hub = new frm_hub(); hub.Show();
但是,每次运行此代码时,都会创建一个新的 frm_hub 实例并使用 hub.Close();不会工作,因为它没有关闭 frm_hub 的同一个新实例
是否有一种方法可以从不同的表单中关闭相同的表单实例 - 比如使用全局变量?或者有什么方法可以集成 Close();所以整个程序继续运行并显示新的表单?-
作为上述问题的一种可能解决方案,我尝试将相同的形式存储为变量:
frm_hub hub = new frm_hub(); private void OpenForm() hub.Show()
但是运行时错误:'System.***Exception: 'System.***Exception' 类型的异常被抛出。当我尝试使用相同的策略将表单存储为两个表单中的变量时,正在显示。
为什么会出现这个错误?有什么办法可以克服吗?-
最后,在针对这个问题的一些阅读中,我发现了控件和面板的使用,通过这种方式,我可以创建一个界面,在面板中打开不同的不同表单
但是,我的尝试需要使用锚点来使表单远程显示与设计器外观一致
如果我不需要调整表单大小,如何使用面板来显示不同的表单,以及如何以显示设计元素的方式显示它们的位置再次为我初学者对术语的理解和使用道歉,请随时寻求澄清我可能没有包括在内的关键细节哈哈, 谢谢!
【问题讨论】:
***Exception 表明您很可能在frm_hub
内创建了一个 frm_hub
实例(希望您能看到问题所在)。无论如何,如果您想访问多个文件中的表单,那么您应该在一个地方创建一个public static
变量/属性并只使用它。或者,您可以使用Application.OpenForms.OfType<frm_hub>().FirstOrDefault()
来获取当前打开的表单实例。
非常感谢!与公静一起创造了奇迹哈哈。作为一个有趣的问题(为了美观),您是否碰巧知道一种方法来消除 .Show() 和 Close() 之间的苛刻过渡。我在第二种形式的 Close() 之前尝试了 Thread.Sleep(50) ,但似乎仍然有闪光。使用 .ShowDialog() 可以实现更平滑的过渡,但是使用公共静态表单和 .Close() 似乎不起作用,因为 .Close() 在 .ShowDialog() 可以运行之前退出表单。如果没有,请不要担心,再次感谢您!
【参考方案1】:
我使用了以下方法,不确定它是否是最佳做法。我使用了一个按钮ShowFrmHubButton
,并在窗口已经显示时禁用了它。
在我的示例中,第二种形式是模态的,只要显示第二个窗口,您就不能使用第一个窗口。
ShowFrmHubButton.IsEnabled = false;
var frmHubWindow = new frm_hub ()
Owner = this
;
frmHubWindow.ShowDialog();
ShowFrmHubButton.IsEnabled = true;
然后,当您关闭\取消第二个表单时,使用this.Close();
【讨论】:
您好!非常感谢您提供此解决方案!不幸的是,更大的问题是,当我导航到 frm_hub 说我在另一个表单中时,我希望我当前所在的表单会关闭然后显示 frm_hub.ShowDialog() - 但这个订单不起作用,因为它要么关闭表单在显示另一个表单之前,或者由于对话框的性质,它根本没有关闭原始表单(这意味着代码直到对话关闭后才会执行)。你碰巧知道怎么解决吗?谢谢! 我可能:既然你声明了一个所有者,你可以使用var parent = Owner as MainWindow;
然后parent.Hide();
注意你不能使用parent.Close()
,因为它拥有frmHubWindow,我认为你可以'不要在构造函数中使用它。
(说真的,我不能再感谢你的帮助)嗯,是的,虽然问题是用说 parent.ShowDialog() 重新显示,因为每次都会打开一个新对话框,所以我最终得到如果用户选择继续打开它,就像 10 个实例一样,但除非使用 .Close(),否则 showdialog 不会重新打开哦,我的想法哈哈
您希望用户能够显示多个frm_hub吗?是否需要同时显示两个窗口?
嗯,不,我不想,就像基本上当点击集线器导航按钮时我希望显示集线器表单,但它是一个更平滑的过渡(只需使用 frm_hub.Show()奇怪的闪烁),我想关闭用户所在的当前表单(这样就不会打开多个实例)。但是,由于某种原因使用 .Hide() 会导致表单的多个实例保持打开状态(因为每次发生按钮事件时都会调用 var frmHubWindow = new frm_hub () ,因此每次都会创建一个新的 frmHubWindow以上是关于如何在 C# Winforms 表单之间转换?的主要内容,如果未能解决你的问题,请参考以下文章