WinForms'ta bir TextBox'tan odak nasıl kaldırılır?


110

Odağı birkaç Metin Kutusundan kaldırmam gerekiyor. Kullanmayı denedim:

textBox1.Focused = false;

Onun ReadOnlyözelliği değeridir true.

Daha sonra odağı tüm Metin Kutularından kaldırmak için forma odaklamayı denedim, ancak bu da işe yaramıyor:

this.Focus();

ve falsebir metin kutusu seçildiğinde işlev geri döner .

Peki, odağı bir Metin Kutusundan nasıl kaldırırım?

Yanıtlar:


113

Odağı hareket ettirmek için başka bir odaklanabilir kontrole ihtiyacınız var.

Odağı bir Etikete ayarlayabileceğinizi unutmayın. [Tab] tuşunun onu nereye götürmesini istediğinizi düşünmek isteyebilirsiniz.

Ayrıca bunu Forma ayarlayamayacağınızı unutmayın. Form ve Panel gibi kapsayıcı denetimleri, Odağı ilk alt denetimlerine aktarır. Hangisinden uzaklaşmasını istediğiniz Metin Kutusu olabilir.


Teşekkürler; Sadece bir etikete odaklanmayı denedim ve şimdi metin kutusu odaklanmamış hale geliyor. Görünüşe göre bir sebepten dolayı bir forma odaklanamıyorsunuz.
Callum Rogers

7
Kapsayıcı Denetimleri (Form, Panel), Odağı ilk alt denetimlerine aktarır.
Henk Holterman

Harika bir öneri. Bu benim sorunumu çözdü. KeyPress'i formun kendisine karşı kullanıyorum ve birkaç düğme vb. Var. Sorun, uygulamanın bir kart okuyucudan girdi almasıdır, bu nedenle odak formun kendisinden uzaklaşırsa, tüm cehennem kopar. Bir düğmeye tıkladıktan sonra bir etikete odaklanmak sorunumu çözdü. Çok teşekkürler!
joelc

62

Etikete odaklanmak benim için işe yaramadı, böyle bir şey yapmak label1.Focus()doğru mu? Form yüklenirken metin kutusu hala odağa sahip, ancak Velociraptors yanıtını denemek benim için çalıştı ve Formun Etkin denetimini şu şekilde etikete ayarladı:

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

7
Keşke sana milyon ok yukarı verebilseydim. İnsanların önerdiği HER ŞEYİ denedim, işe yarayan tek şey bu. bazı nedenlerden dolayı, metin kutusu HER ZAMAN odağı her şeyden çaldı ...
eladyanai

3
Bu aynı zamanda paneller gibi konteyner kontrolleri için de işe yarar. Odağı tamamen kaldırmak istedim ve işe yaradı:this.ActiveControl = panelOnMyForm;
Tim Schmelter

52

Aşağıdaki kodu ekleyebilirsiniz:

this.ActiveControl = null;  //this = form

7
Bunun en iyi cevap olduğuna inanıyorum. MSDN'yi okursanız, "Odaklanma" gibi diğer birçok yöntem, denetim tasarımcıları için düşük düzey yöntemler olarak listelenir. Diğer her şeyin "seçilmemesini" istiyorsanız, bu en kolay yaklaşım gibi görünüyor, çünkü bu sadece küçük bir çizgi.
Rostov

1
Bu, Microsoft'un bu özelliği ilk başta eklemesinin yarısı olabilir.
Panzercrisis

Bu en zarif çözüm gibi görünüyor, benim durumumda mükemmel çalıştı.
NetWave

Bu cevabın gerçekten işe yaramasını istiyorum çünkü olması gerektiği gibi görünüyor, ama benim durumumda işe yaramadı çünkü Ayrılma olayını tetiklerken Doğrulayıcı / Doğrulanan olayları tetiklemedi.
Rhys Jones

32

Metin kutusunu devre dışı bırakmayı ve etkinleştirmeyi deneyin.


5
Bu arada, sekme listesindeki bir sonraki kontrolü otomatik olarak seçtiği için oldukça düzgün çalışır.
Nick

3
Silverlight'ta MVVM kullanarak geliştiriyorum ve bunu bir TextBox'ı hedefleyen bir davranış kullanarak uyguladım. Odağı Devre Dışı Bırak / Etkinleştir çözümüne ayarlamak için başka bir UIElement kullanmadığım için harikalar yarattı. Teşekkürler!
Albert Oldfield

Nasıl devre dışı bırakabilirim?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;metin kutunuzu devre dışı bırakacaktır. ve olarak ayarlandığında trueyeniden etkinleştirilir.
Raktim Biswas

24

Form activecontrolözelliğini nullbeğenmek için de ayarlayabilirsiniz

ActiveControl = null;

7
Umarım insanlar bunu sonuna kadar kaydırır ve sadece cevap olarak işaretlenen geçici çözümü kullanmayın
makoshichi

Hala bugün için en iyi cevap, dostum, oyumu al.
xoxel

8

Focusgiriş odağını ayarlar, böylece formlar girişi kabul etmediğinden forma ayarlamak işe yaramaz. Formun ActiveControlözelliğini farklı bir denetime ayarlamayı deneyin . Ayrıca Select, belirli bir denetimi SelectNextControlseçmek veya sekme sırasında sonraki denetimi seçmek için de kullanabilirsiniz .


1
Burada her şeyi denedim ve Select()benim için çalıştı.
Derek W

8

Bunu dene:

İlk olarak sekme sırasını ayarlayın.

Daha sonra form yükleme olayında uygulamaya programlı olarak bir sekme tuşuna basabiliriz. Böylece uygulama sekme sırasındaki 1. kontrole odaklanacaktır.

form yükünde bu satırı bile yazın.

SendKeys.Send("{TAB}");

Bu benim için çalıştı.


4

Bu gönderi beni bunu yapmaya yönlendiriyor:

ActiveControl = null;

Bu, diğer kontroller çıldırmadan en üst seviyedeki tüm klavye girişlerini yakalamamı sağlıyor.


3

İyi bir alternatif buldum! Odağı başka bir şeye odaklamadan benim için en iyi şekilde çalışıyor.

Bunu dene:

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

3

Bunu özel kontrolümde yaptım, bunu onFocus () yaptım

this.Parent.Focus();

Yani, eğer metin kutusu odaklanmışsa - metin kutusu üst öğeye (form veya panel ...) anında odaklanır. Bunu özel kontrol üzerinde yapmak istiyorsanız bu iyi bir seçenektir.


2

Görünüşe göre odağı başka unsurlara ayarlamam gerekmiyor. Bir Windows Phone 7 uygulamasında, bir Metin Kutusunun Odağını kaldırmak için Focus yöntemini kullanıyorum.

Aşağıdaki komutu vermek, odağı hiçbir şeye ayarlamaz:

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

Benim için çalıştı, ama neden senin için işe yaramadı bilmiyorum: /


2

Basit bir çözüm, odağı yok etmek, sadece kendi sınıfınızı oluşturmak olabilir:

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);
    }
}

Tam da aradığım türden bir çözüm. Teşekkürler!
LeftyCoder

1
    //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();
                });
            }
        }
    }

0

Bunu aşma şeklim, tüm winform kontrollerimi yerleştirmek. Tüm etiketleri ve seçilmeyen winform kontrollerini sekme sırası 0 olarak yapıyorum, sonra ilk kontrolümü sekme sırası 2 olarak yapıyorum ve ardından her seçilebilir kontrolün sırasını 1, yani 3, 4, 5 vb. Artırıyorum ...

Bu şekilde, Winformlarım başladığında, ilk Metin Kutusu'nun odağı olmaz!


0

bunu iki yöntemle yapabilirsiniz

  • sadece istenen metin kutusunun "TabStop" özelliklerini yanlış yapın, şimdi bir metin alanınız olsa bile odaklanmayacaktır
  • iki metin kutusunu sürükleyin

    1. foucus istemediğiniz birini görünür yapın, bu metin kutusu1
    2. ikincisini görünmez yapın ve bu metin alanının özelliklerine gidin ve seçin

tabindex değeri textbox2'nin 0'ı

  1. ve 1'e 1 metin kutunuzun sekme dizinini seçin, artık metin kutusu1'e odaklanmayacaktır

0

İstediğiniz tek şey, metin kutusunun tüm içeriğinde mavi seçim olmadığı optik efektse, metin yok seçeneğini seçmeniz yeterlidir:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

Bundan sonra, ile içerik eklerken .Text += "..."mavi seçim gösterilmeyecektir.


0

Set deneyin TabStopiçinFalse odaklanmış edilmediğini görünümü kontrolü için.

Örneğin:

txtEmpID.TabStop = false;

-1

TextBox yazısını tutan Form veya UserControl yapıcısında

SetStyle(ControlStyles.Selectable, false);

InitializeComponent () işleminden sonra; Kaynak: https://stackoverflow.com/a/4811938/5750078

Misal:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.