C#怎樣保證彈出窗體是唯一並居中顯示


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM