最近几天在搞一个C# WinForm程序,关于Form控制的两个小技巧随笔,附上简单的FormHelper,以供参考:
注: 其中关于 Application.OpenForms的用法,避免因为字典的动态改变而无法继续执行;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Utils
{
public static class FormHelper
{
public static void WithParentLocation(Form parentForm, Form childForm)
{
int m = parent.Right;
int n = parent.Top;
child.Location = new Point(m - 8, n);
}
public static void OpenAnotherForm(this Form main,Form wantOpenForm)
{
if (wantOpenForm != null) {
lock(Application.OpenForms)
{
for (int i = 0; i < Application.OpenForms.Count; i++)
{
var from = Application.OpenForms[i];
if (from is Form && (Form)from != main)
{
((Form)from).Close();
}
}
}
}
main.OwnedForms.Prepend(wantOpenForm);
wantOpenForm.Show();
}
}
}
1)拖动主窗口,子窗口跟随主窗口移动;子窗口打开后,通过主窗口的Move事件,实现子窗口跟随主窗口无闪烁移动;
/// <summary>
/// 主窗口Move事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void WinMain_Move(object sender, EventArgs e)
{
if (FirstStart > 0)
{
if (_ChildForm != null)
FormHelper.WithParentLocation(this, _childForm);
}
FirstStart++;
}
子窗口的默认展示位置在主窗口右侧
/// <summary>
/// 子窗口Load事件
/// </summary>
private void WinChild_Load(object sender, EventArgs e)
{
FormHelper.WithParentLocation(Application.OpenForms["WinMain"], this);
}
2)打开一个新的子窗口同时,关闭其他所有子窗口;
private void openChildToolStripMenuItem_Click(object sender, EventArgs e)
{
//FormHelper.OpenAnotherForm
this.OpenAnotherForm(new ChildForm());
}
干货!自取!