C# 窗体位置管理器
一篇包含有关处理窗体位置的类的详细信息的文章,
我找不到一个好的通用类示例来记录窗口的位置。我发现的示例代码通常依赖于为每个单独的窗口添加代码。 我认为,这有两个缺点
- 你在每个窗体中都有很多重复的代码。
- 每个窗体总是以相同的方式调整大小。 如果您想将同一窗体用于两个不同的目的,它将始终出现在同一位置。
以下代码是一个类,它将跟踪一个或多个窗口并在它们关闭时记录它们的位置。 它不需要对现有窗体进行任何更改,并且只需一个对象即可处理多个窗体。
要实例化该类,您需要向该类传递一个要使用的应用程序名称。 这用于在当前用户的 hive 中创建或打开一个注册表项,并为窗体创建一个子键。 每个窗体都有自己的窗体键子分支,用于存储有关各个窗体的信息。
要处理一个窗体,您可以调用 HandleForm
函数。 这会将窗体与您传入的 formName
一起跟踪在 hashtable
中。 如果您希望根据其内容或调用它的对象,将同一窗体在两个不同的位置打开,那么您可以简单地传入不同的窗体名称,每个单独版本的窗体现在都将在不同的位置加载和保存。
formLocationHandler = new FormManager.FormLocationHandler("Test App");
formLocationHandler.HandleForm("Form2", newForm);
newForm.Show();
如果不想在创建 FormManager 后再麻烦它,static
函数调用 HandleFormForApp
也作为一个便捷方法提供。
FormManager.FormLocationHandler.HandleFormForApp("Test App", "Form1 Take2", newForm);
当窗体关闭时,窗体会触发 form.Closing
事件,该事件会调用 FormLocationHandler
。 然后,这会将窗体的位置记录回注册表中,以备下次读取窗体时使用。
此代码存在几个问题,可以通过以下方式解决
- 如果打开一个窗口,调整它的大小,然后打开该窗口的另一个副本(不关闭第一个),它将与原始窗口大小相同,而不是调整大小后的窗口。 您可以通过在每次触发
form.LocationChanged
或form.SizeChanged
事件时保存窗体位置和大小来避免这种情况,但这也会磨损您的注册表,从而减慢您的应用程序的速度。 - 另一种选择是检查
hashtable
中是否有一个具有相同名称的窗体(窗体名称存储在hashtable
中),并从注册表复制位置。
历史
- 2005 年 11 月 2 日: 初始发布