c# - كيفية إزالة التركيز من مربع نص في WinForms؟




.net textbox focus (16)

    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

أحتاج لإزالة التركيز من عدة مربعات. لقد حاولت استخدام:

textBox1.Focused = false;

قيمة الخاصية ReadOnly الخاصة به true .

ثم حاولت إعداد التركيز على النموذج ، لإزالته من جميع مربعات النص ، ولكن هذا أيضًا فشل في العمل:

this.Focus();

وتقوم الدالة بإرجاع false عند تحديد مربع نص.

لذا ، كيف يمكنني إزالة التركيز من مربع نص؟


سيكون الحل البسيط لقتل التركيز ، فقط قم بإنشاء صفك الخاص:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

جرب هذه..

إعداد أول طلب جدولة ..

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

في تحميل النموذج حتى كتابة هذا الخط.

SendKeys.Send("{TAB}");

هذا العمل بالنسبة لي.


لم يعمل التركيز على العلامة لي ، فعل شيء مثل label1.Focus() أليس كذلك؟ لا يزال التركيز على مربع النص عند تحميل النموذج ، ومع ذلك يحاول Velociraptors الإجابة ، عملت بالنسبة لي ، وضع عنصر التحكم النشط للنموذج إلى التسمية مثل هذا:

private void Form1_Load(object sender, EventArgs e)  
{ 
  this.ActiveControl = label1;       
}

أنا جعلت هذا على التحكم المخصص الخاص بي ، فعلت هذا onFocus ()

this.Parent.Focus();

لذا إذا ركز texbox - فهو يركز على الفور على حقل النص الأساسي (نموذج ، أو لوحة ...) وهذا خيار جيد إذا كنت تريد إجراء ذلك على التحكم المخصص.


حاول تعطيل وتمكين مربع النص.


الرجاء محاولة تعيين TabStop على False للتحكم في طريقة العرض التي لا تكون مركزة.

على سبيل المثال:

txtEmpID.TabStop = false;

تحتاج إلى بعض التحكم الأخرى القابلة للتركيز لنقل التركيز إلى.

لاحظ أنه يمكنك ضبط التركيز على تسمية. قد ترغب في التفكير في المكان الذي تريد أن ينتقل فيه المفتاح [Tab] إلى التالي.

لاحظ أيضًا أنه لا يمكنك تعيينه على النموذج. ستنتقل أدوات التحكم في الحاويات مثل Form و Panel إلى التركيز الأول على التحكم في الطفل. الذي يمكن أن يكون TextBox كنت تريد أن تبتعد عنه.


هذه المشاركة تقودني للقيام بذلك:

ActiveControl = null;

هذا يتيح لي التقاط جميع مدخلات لوحة المفاتيح في المستوى العلوي دون غيرها من الضوابط الذهاب المكسرات.


لقد وجدت بديلا جيدا! إنه أفضل بالنسبة لي ، دون التركيز على شيء آخر.

جرب ذلك:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

يمكنك اضافة الكود التالي:

this.ActiveControl = null;  //this = form

يمكنك القيام بذلك من خلال طريقتين

  • فقط جعل خصائص "TabStop" من مربع النص المطلوب إلى false الآن لن يركز حتى إذا كان لديك حقل نص واحد
  • اسحب مربع النص

    1. جعل واحد مرئي الذي لا تريد foucus وهو textbox1
    2. جعل الثاني غير مرئي واذهب إلى خصائص حقل النص وحدد

قيمة tabindex إلى 0 من textbox2

  1. وحدد tabindex الخاص بك textbox1 إلى 1 الآن فإنه لن يركز على textbox1

Focus على الإدخال ، لذلك لن يعمل تعيينه على النموذج لأن النماذج لا تقبل الإدخال. حاول إعداد الخاصية ActiveControl النموذج إلى عنصر تحكم آخر. يمكنك أيضًا استخدام Select لتحديد عنصر تحكم محدد أو SelectNextControl لتحديد عنصر التحكم التالي في ترتيب الجدولة.


يبدو أنني لست مضطرًا إلى ضبط التركيز على أي عناصر أخرى. في تطبيق Windows Phone 7 ، كنت أستخدم طريقة Focus لإلغاء تعيين التركيز على مربع نص.

يؤدي تعيين الأمر التالي إلى ضبط التركيز على لا شيء:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

لقد نجحت في ذلك ، لكنني لا أعرف لماذا لم تعمل من أجلك: /


الطريقة التي أتغلب عليها هي وضع جميع عناصر التحكم في winform. أقوم بإجراء جميع التسميات وعدم تحديد عناصر تحكم winform كأمر جدولة 0 ، ثم عنصر التحكم الأول الخاص بي كطلب جدولة 2 ثم زيادة كل طلب تحكم قابل للتحديد بنسبة 1 ، لذلك 3 ، 4 ، 5 الخ ...

بهذه الطريقة ، عند بدء تشغيل Winforms الخاص بي ، لا يكون التركيز الأول على TextBox!


private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}




c# .net winforms textbox focus