星期五, 3月 02, 2018

[C#] MDI 子視窗最大化

Line 群上問題
MDI內的子視窗若開啟一個以上,如果其中一個子使窗放大或縮小 (WindowState=Maximized or WindowState=Minimized),其他的子視窗也會一併的被放大或縮小,是否有方式可以讓其他子視窗不要受到影響可以維持原有的狀態
實務上子視窗都是使用 Max,剛好有興趣來了解,還真的有這樣的特性,當 MDI 父視窗內的子視窗為 Max 時,把子視窗關閉,下一個Active 子視窗也會被 Max

MDI Form 內找不到屬性可以直接設定來取消這樣的情況,所以是透過 MdiChildActivate Event 搭配 ActiveMdiChild Property 把 WindowsState 設回去
namespace MDIWindowState
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private void BtnForm_Click(object sender, EventArgs e)
        {
            FormWindowState WindowStateSetting = FormWindowState.Normal;
            for (int i = 1; i <= 5; i++)
            {
                Form f = new Form
                {
                    MdiParent = this,
                    Text = $"第{i}個 Form",
                    WindowState = WindowStateSetting,
                    // 把 WindowState 初始化設定值存在 Tag 內
                    Tag = WindowStateSetting
                };
                f.Show();
            }
        }

        private void Form1_MdiChildActivate(object sender, EventArgs e)
        {
            Form f = (Form)this.ActiveMdiChild;
            if (f == null)
            {
                return;
            }

            f.WindowState = (FormWindowState)f.Tag;
        }
    }
}

按下 Button 產生 5 個 Form 來觀察

[C#] MDI 子視窗最大化-1

把 Form5 變成 Max 後,父視窗的 Text 屬性,會有目前 Active 子視窗的 Text 內容

[C#] MDI 子視窗最大化-2

把 Form 5 關閉,Form4 不會是 Max,而是建立時的預設值 Normal

[C#] MDI 子視窗最大化-3

沒有留言:

張貼留言