التعامل بكفاءة مع إدخال البيانات الرقمية في تطبيقات WPF

عند تطوير التطبيقات باستخدام Windows Presentation Foundation (WPF)، يواجه المطورون تحديًا شائعًا وهو كيفية إدارة إدخال القيم الرقمية. وتبرز هذه المشكلة بشكل خاص عندما لا يرغب المرء في الاعتماد على عناصر التحكم الخارجية أو من طرف ثالث لميزة NumericUpDown.

في هذه المقالة، سنستكشف حلاً بسيطًا للتعامل مع الإدخال الرقمي باستخدام عنصر التحكم القياسي TextBox مع ضمان واجهة نظيفة وسهلة الاستخدام.

المشكلة: إدارة الإدخال الرقمي في WPF

بدون راحة استخدام عنصر التحكم NumericUpDown، كيف يمكننا التأكد من أن المستخدمين يدخلون فقط القيم الرقمية في TextBox؟ غالبًا ما يلجأ المطورون إلى إدارة أحداث المفاتيح يدويًا، مما يؤدي عادةً إلى كود معقد وأقل وضوحًا. وقد وجد العديد أنفسهم ينفذون معالجات الأحداث لاعتراض مدخلات لوحة المفاتيح بطريقة تضمن معالجة الأرقام فقط.

إليك مقطع كود شائع يستخدمه المطورون للتحقق من صحة الإدخال الرقمي:

private void NumericEditPreviewKeyDown(object sender, KeyEventArgs e)
{
    bool isNumPadNumeric = (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Decimal;
    bool isNumeric = (e.Key >= Key.D0 && e.Key <= Key.D9) || e.Key == Key.OemPeriod;

    if ((isNumeric || isNumPadNumeric) && Keyboard.Modifiers != ModifierKeys.None)
    {
        e.Handled = true;
        return;
    }

    bool isControl = ((Keyboard.Modifiers != ModifierKeys.None && Keyboard.Modifiers != ModifierKeys.Shift)
        || e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Insert
        || e.Key == Key.Down || e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up
        || e.Key == Key.Tab
        || e.Key == Key.PageDown || e.Key == Key.PageUp
        || e.Key == Key.Enter || e.Key == Key.Return || e.Key == Key.Escape
        || e.Key == Key.Home || e.Key == Key.End);

    e.Handled = !isControl && !isNumeric && !isNumPadNumeric;
}

بينما قد يبدو أن هذا الحل مقبول في البداية، إلا أنه ليس أنيقًا. قد يصبح الكود سريعًا صعب القراءة والصيانة. ولحسن الحظ، هناك بديل أكثر أناقة.

الحل: تبسيط التحقق من صحة الأرقام

بدلاً من التطرق إلى تعقيدات التعامل مع كل ضغطة مفتاح محتملة، يمكننا تبسيط عملية التحقق من الصحة باستخدام حدث OnPreviewTextInput. يتيح هذا الأسلوب تنفيذًا أكثر وضوحًا. إليك كيفية تحقيق ذلك:

الخطوة 1: تجاوز طريقة OnPreviewTextInput

يمكنك بسهولة التحقق مما إذا كانت المدخلات تتكون من أحرف رقمية صالحة عن طريق تجاوز طريقة OnPreviewTextInput الخاصة بـ TextBox:

protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
{
    e.Handled = !AreAllValidNumericChars(e.Text);
    base.OnPreviewTextInput(e);
}

الخطوة 2: إنشاء طريقة مساعدة للتحقق من صحة الأحرف

إليك طريقة مساعدة بسيطة تتحقق مما إذا كانت جميع الأحرف في سلسلة الإدخال رقمية:

private bool AreAllValidNumericChars(string str)
{
    foreach(char c in str)
    {
        if(!Char.IsNumber(c)) return false; // أعد false إذا تم العثور على حرف غير رقمي
    }

    return true; // أعد true إذا كانت جميع الأحرف رقمية
}

الخاتمة

من خلال الاستفادة من طريقة OnPreviewTextInput إلى جانب طريقة تحقق مخصصة، يمكننا إدارة الإدخال الرقمي في تطبيقات WPF بكفاءة دون تشويش كودنا بالتعامل المعقد مع أحداث المفاتيح. لا يعزز هذا الأسلوب فقط من قراءة الكود ولكن أيضًا يحسن تجربة المستخدم من خلال ضمان قبول المدخلات الرقمية الصالحة فقط.

تنفيذ حل نظيف وفعال يسمح للمطورين بالتركيز أكثر على الوظائف الأساسية لتطبيقاتهم بدلاً من الانشغال بآليات التحقق المعقدة للإدخال.

أليس حان الوقت لتبسيط منطق إدخال البيانات الرقمية لديك في WPF؟ جرب هذا الأسلوب واستمتع بكود أكثر نظافة وتجربة مستخدم أفضل!