ทำไมคุณไม่สามารถผูก Size ของ Windows Form กับ ApplicationSettings ได้?

ในฐานะที่เราเป็นนักพัฒนาที่ทำงานกับ Windows Forms เรามักจะค้นหาวิธีการที่สามารถปรับปรุงประสบการณ์ผู้ใช้โดยการรักษาสถานะของแอปพลิเคชันไว้ หนึ่งในคำถามทั่วไปที่เกิดขึ้นเมื่อใช้ ApplicationSettings กับ Windows Forms คือ: ทำไมคุณไม่สามารถผูกขนาดของ Windows Form โดยตรงกับ ApplicationSettings ได้?

ข้อจำกัดนี้อาจทำให้รู้สึกหงุดหงิด โดยเฉพาะเมื่อคุณสมบัติอื่น ๆ ดูเหมือนว่าจะผูกง่าย ๆ อย่างไรก็ตาม มีวิธีในการจัดการกับปัญหานี้และทำให้แน่ใจว่าขนาดและสถานะของหน้าต่างแอปพลิเคชันของคุณถูกบันทึกระหว่างเซสชัน มาสำรวจพื้นฐานของปัญหาและตรวจสอบวิธีแก้ไขอย่างละเอียดกันเถอะ

ทำความเข้าใจกับข้อจำกัด

เมื่อคุณพยายามที่จะผูกขนาดของ Windows Form โดยตรงกับ ApplicationSettings คุณอาจสังเกตเห็นว่าคุณสมบัติ Size ไม่มีในรายการการผูกคุณสมบัติ นี่เป็นเพราะว่าขนาดของฟอร์มไม่สามารถผูกได้ง่าย ๆ มักจะต้องการบริบทที่มากขึ้นเนื่องจากความจำเป็นในการบันทึกสถานะของฟอร์มเมื่อมันถูกขยายเต็มที่หรือย่อขนาด

ทำไมการจัดการอย่างชัดเจนจึงจำเป็น

  • การกู้คืนสถานะ: การผูกขนาดโดยตรงจะไม่คำนึงถึงการเปลี่ยนแปลงที่อาจเกิดขึ้นในสถานะของฟอร์ม (เช่น ฟอร์มถูกย่อหรือตรงข้าม)
  • การใช้คุณสมบัติเพิ่มเติม: เมื่อฟอร์มไม่ได้อยู่ในสถานะปกติ ขนาดต้องดึงมาจาก RestoreBounds ซึ่งไม่ได้รับการอัปเดตผ่านการผูกแบบง่าย

วิธีแก้ไข: การสร้างคลาส RestorableForm

เพื่อแก้ไขข้อจำกัดนี้อย่างมีประสิทธิภาพ สามารถสร้างซับคลาสของ Form ซึ่งเราจะเรียกว่า RestorableForm คลาสนี้จะจัดการขนาดและสถานะของหน้าต่างแอปพลิเคชันได้อย่างราบรื่น โดยใช้การเขียนทับและการผูกที่จำเป็น

วิธีการดำเนินการทีละขั้นตอน

  1. สืบทอดจาก RestorableForm แทนที่จะเป็น Form ทั่วไป

  2. เพิ่มการผูกกับ WindowRestoreState

    • การผูกนี้จะเก็บและบันทึกตำแหน่งและสถานะของหน้าต่าง
  3. เรียกใช้การบันทึกการตั้งค่าเมื่อปิดแอปพลิเคชัน

    • เรียก Properties.Settings.Default.Save() เมื่อปิดหน้าต่างเพื่อให้แน่ใจว่าการตั้งค่าทั้งหมดถูกเก็บไว้

ตัวอย่างโค้ด

นี่คือการดำเนินการที่กระชับของคลาส RestorableForm:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace Utilities
{
    public class RestorableForm : Form, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private WindowRestoreStateInfo windowRestoreState;

        [Browsable(false)] 
        [SettingsBindable(true)] 
        public WindowRestoreStateInfo WindowRestoreState
        {
            get { return windowRestoreState; }
            set
            {
                windowRestoreState = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("WindowRestoreState"));
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            WindowRestoreState = new WindowRestoreStateInfo
            {
                Bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds,
                WindowState = WindowState
            };
            base.OnClosing(e);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (WindowRestoreState != null)
            {
                Bounds = ConstrainToScreen(WindowRestoreState.Bounds);
                WindowState = WindowRestoreState.WindowState;
            }
        }

        private Rectangle ConstrainToScreen(Rectangle bounds)
        {
            // กฎการจำกัดที่นี่...
        }

        public class WindowRestoreStateInfo
        {
            public Rectangle Bounds { get; set; }
            public FormWindowState WindowState { get; set; }
        }
    }
}

จุดสำคัญในโค้ด

  • การจัดการคุณสมบัติ: คุณสมบัติ WindowRestoreState จะเก็บทั้งตำแหน่งและสถานะ
  • การโหลดและบันทึกสถานะ: วิธีการที่เขียนทับจะดูแลการกู้คืนตำแหน่งและการจัดการสถานะของหน้าต่างเมื่อปิด
  • ข้อจำกัดของหน้าจอ: วิธี ConstrainToScreen จะทำให้แน่ใจว่าฟอร์มพอดีกับหน้าจอ ซึ่งมีความสำคัญเมื่อกู้คืนขนาดและตำแหน่งของมัน

แหล่งข้อมูลสำหรับการเรียนรู้เพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับส่วนประกอบที่ใช้ในคลาส RestorableForm คุณอาจพบว่าลิงก์เหล่านี้มีคุณค่า:

สรุป

การผูก Size ของ Windows Form โดยตรงกับ ApplicationSettings นำเสนอความท้าทาย แต่ด้วยคลาส RestorableForm คุณสามารถมั่นใจได้ว่าแอปพลิเคชันของคุณจะจดจำสถานะของมันตลอดเซสชันต่าง ๆ โดยการใช้การจัดการสถานะอย่างชัดเจน คุณสามารถทำให้ผู้ใช้มีประสบการณ์ที่มีความสอดคล้องและเป็นส่วนตัวมากขึ้นเมื่อใช้แอปพลิเคชันของคุณ

ด้วยวิธีนี้คุณสามารถจัดการขนาดและสถานะของ Windows Forms ได้อย่างมีประสิทธิภาพ และสร้างแอปพลิเคชันที่เป็นมิตรกับผู้ใช้ซึ่งรู้สึกตอบสนองและใช้งานง่าย