Winform窗體中,假如我從Form1窗體要彈出Form2窗體,寫法是這樣的:
Form2 f2 = new Form2();
f2.Show();
1、如何使窗體打開時居中顯示
//初始化默認窗體居中顯示
Form2 f2 = new Form2();
f2.StartPosition = FormStartPosition.CenterScreen;
f2.Show();
2、如何實現彈出子窗口的不關閉時,其它的窗口無法操作
Form2 f2 = new Form2();
f2.StartPosition = FormStartPosition.CenterScreen;
f2.ShowDialog();
3、如何保證打開窗體是唯一的(是通過show()打開)
例子如下:
1、窗體頁面
1)Form1頁面
2)Form2頁面
2、頁面源碼
1)Form1頁面源碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TestWinForm { public partial class Form1 : Form { //創建全局變量,用來存放已show出的窗體對象 List<Form> allforms = new List<Form>(); public Form1() { InitializeComponent(); //初始化默認居中顯示 this.StartPosition = FormStartPosition.CenterScreen; } /// <summary> /// 普通方式(通過直接show出來) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOpen_Click(object sender, EventArgs e) { if (this.txtAddMsg.Text == "") { MessageBox.Show("輸入信息文本不能為空"); return; } string msg = this.txtAddMsg.Text; //實例化對象 Form2 f2 = new Form2(this); //居中顯示 f2.StartPosition = FormStartPosition.CenterScreen; //打開窗體 f2.Show(); } /// <summary> /// 特殊方式(通過onlyoneForm()方法處理) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOpen1_Click(object sender, EventArgs e) { if (this.txtAddMsg.Text == "") { MessageBox.Show("輸入信息文本不能為空"); return; } string msg = this.txtAddMsg.Text; //實例化對象 Form2 f2 = new Form2(this,msg); //設置居中顯示 f2.StartPosition = FormStartPosition.CenterScreen; //驗證並保證窗體唯一 onlyoneForm(f2); } #region 保證窗體唯一方法 /// <summary> /// 顯示唯一的窗體 /// </summary> /// <param name="FF"></param> private void onlyoneForm(Form FF) { //判斷窗體是否已經彈出,默認false bool hasform = false; //遍歷所有窗體對象 foreach (Form f in allforms) { //判斷彈出的窗體是否重復 if (f.Name == FF.Name) { //重復,修改為true hasform = true; f.WindowState = FormWindowState.Normal; //獲取焦點 f.Focus(); } } if (hasform) { FF.Close(); } else { //添加到所有窗體中 allforms.Add(FF); //並打開該窗體 FF.Show(); } } /// <summary> /// 移除窗體對象 /// </summary> /// <param name="f"></param> public void RemoveForm(Form f) { if (allforms.Contains(f)) { allforms.Remove(f); } } #endregion } }
2)Form2頁面源碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestWinForm
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//保存傳遞的窗體對象
Form1 form1 = null;
public Form2(Form1 f1) {
InitializeComponent();
form1 = f1;
}
public Form2(Form1 f1, string msg) {
InitializeComponent();
form1 = f1;
this.txtShowMsg.Text = msg;
}
/// <summary>
/// 移除窗體對象
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
form1.RemoveForm(this);
}
}
}
3、結果視圖頁面
1)普通方式結果
2)特殊方式結果
參考來源:
http://www.mamicode.com/info-detail-1375089.html
http://www.cnblogs.com/sunshuping/p/5850799.html
