ทำไมคุณไม่สามารถผูก Size
ของ Windows Form กับ ApplicationSettings
ได้?
ในฐานะที่เราเป็นนักพัฒนาที่ทำงานกับ Windows Forms เรามักจะค้นหาวิธีการที่สามารถปรับปรุงประสบการณ์ผู้ใช้โดยการรักษาสถานะของแอปพลิเคชันไว้ หนึ่งในคำถามทั่วไปที่เกิดขึ้นเมื่อใช้ ApplicationSettings
กับ Windows Forms คือ: ทำไมคุณไม่สามารถผูกขนาดของ Windows Form โดยตรงกับ ApplicationSettings
ได้?
ข้อจำกัดนี้อาจทำให้รู้สึกหงุดหงิด โดยเฉพาะเมื่อคุณสมบัติอื่น ๆ ดูเหมือนว่าจะผูกง่าย ๆ อย่างไรก็ตาม มีวิธีในการจัดการกับปัญหานี้และทำให้แน่ใจว่าขนาดและสถานะของหน้าต่างแอปพลิเคชันของคุณถูกบันทึกระหว่างเซสชัน มาสำรวจพื้นฐานของปัญหาและตรวจสอบวิธีแก้ไขอย่างละเอียดกันเถอะ
ทำความเข้าใจกับข้อจำกัด
เมื่อคุณพยายามที่จะผูกขนาดของ Windows Form โดยตรงกับ ApplicationSettings
คุณอาจสังเกตเห็นว่าคุณสมบัติ Size ไม่มีในรายการการผูกคุณสมบัติ นี่เป็นเพราะว่าขนาดของฟอร์มไม่สามารถผูกได้ง่าย ๆ มักจะต้องการบริบทที่มากขึ้นเนื่องจากความจำเป็นในการบันทึกสถานะของฟอร์มเมื่อมันถูกขยายเต็มที่หรือย่อขนาด
ทำไมการจัดการอย่างชัดเจนจึงจำเป็น
- การกู้คืนสถานะ: การผูกขนาดโดยตรงจะไม่คำนึงถึงการเปลี่ยนแปลงที่อาจเกิดขึ้นในสถานะของฟอร์ม (เช่น ฟอร์มถูกย่อหรือตรงข้าม)
- การใช้คุณสมบัติเพิ่มเติม: เมื่อฟอร์มไม่ได้อยู่ในสถานะปกติ ขนาดต้องดึงมาจาก
RestoreBounds
ซึ่งไม่ได้รับการอัปเดตผ่านการผูกแบบง่าย
วิธีแก้ไข: การสร้างคลาส RestorableForm
เพื่อแก้ไขข้อจำกัดนี้อย่างมีประสิทธิภาพ สามารถสร้างซับคลาสของ Form
ซึ่งเราจะเรียกว่า RestorableForm
คลาสนี้จะจัดการขนาดและสถานะของหน้าต่างแอปพลิเคชันได้อย่างราบรื่น โดยใช้การเขียนทับและการผูกที่จำเป็น
วิธีการดำเนินการทีละขั้นตอน
-
สืบทอดจาก
RestorableForm
แทนที่จะเป็นForm
ทั่วไป -
เพิ่มการผูกกับ WindowRestoreState
- การผูกนี้จะเก็บและบันทึกตำแหน่งและสถานะของหน้าต่าง
-
เรียกใช้การบันทึกการตั้งค่าเมื่อปิดแอปพลิเคชัน
- เรียก
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 ได้อย่างมีประสิทธิภาพ และสร้างแอปพลิเคชันที่เป็นมิตรกับผู้ใช้ซึ่งรู้สึกตอบสนองและใช้งานง่าย