Como remover o foco de um TextBox em WinForms?

110

Preciso remover o foco de vários TextBoxes. Tentei usar:

textBox1.Focused = false;

O ReadOnlyvalor de sua propriedade é true.

Em seguida, tentei definir o foco no formulário, de forma a removê-lo de todos os TextBoxes, mas também não funcionou:

this.Focus();

e a função retorna falsequando uma caixa de texto é selecionada.

Então, como removo o foco de um TextBox?

Callum Rogers
fonte

Respostas:

113

Você precisa de algum outro controle focalizável para mover o foco.

Observe que você pode definir o foco como um rótulo. Você pode querer considerar para onde deseja que a tecla [Tab] leve isso a seguir.

Observe também que você não pode configurá-lo para o formulário. Controles de container como Form e Panel irão passar o Focus para seu primeiro controle filho. Que poderia ser a TextBox da qual você gostaria que ele se afastasse.

Henk Holterman
fonte
Obrigado; Eu apenas tentei focar em um rótulo e agora a caixa de texto fica desfocada. Parece que você não consegue se concentrar em um formulário por algum motivo.
Callum Rogers
7
Os controles de recipiente (formulário, painel) passarão o foco para o primeiro controle filho.
Henk Holterman
Ótima sugestão. Isso resolveu meu problema. Estou usando o KeyPress contra o próprio formulário e tenho vários botões, etc. O problema é que o aplicativo está recebendo entrada de um leitor de cartões, então se o foco sair do próprio formulário, então tudo se solta. Ter o foco em um rótulo após um clique de botão resolveu meu problema. Muito obrigado!
joelc de
62

Focar na etiqueta não funcionou para mim, fazer algo como label1.Focus()certo? a caixa de texto ainda está em foco ao carregar o formulário, no entanto, tentar responder aos Velociraptores funcionou para mim, configurando o controle Ativo do Form para o rótulo assim:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
Porquê tão sério
fonte
7
Eu gostaria de poder te dar milhões de flechas. Eu tentei TUDO mais que as pessoas sugeriram, este é o único que funcionou. por algum motivo, a caixa de texto SEMPRE roubou o foco de tudo ...
eladyanai
3
Isso também funciona para controles de contêiner, como painéis. Eu só queria remover o foco completamente e funcionou:this.ActiveControl = panelOnMyForm;
Tim Schmelter,
52

Você pode adicionar o seguinte código:

this.ActiveControl = null;  //this = form
FTheGodfather
fonte
7
Acredito que esta seja a melhor resposta. Muitos outros métodos, como "Foco", se você ler o MSDN, estão listados como métodos de baixo nível para designers de controle. Se você deseja que todo o resto seja "não selecionado", esta parece ser a abordagem mais fácil, pois, bem, é apenas uma pequena linha.
Rostov
1
Esta pode ser a metade da razão pela qual a Microsoft adicionou essa propriedade em primeiro lugar.
Panzercrisis de
Esta parece ser a solução mais elegante, funcionou perfeitamente no meu caso.
NetWave
Eu realmente quero que essa resposta funcione porque parece que deveria, mas no meu caso não funcionou porque, embora tenha acionado o evento Sair, não acionou os eventos Validando / Validado.
Rhys Jones
32

Tente desativar e ativar a caixa de texto.

Spencer Ruport
fonte
5
Isso funciona muito bem, uma vez que seleciona automaticamente o próximo controle na lista de guias enquanto isso.
Nick
3
Estou desenvolvendo no Silverlight usando MVVM e implementei isso usando um comportamento direcionado a um TextBox. Como eu não tinha outro UIElement à mão para definir o foco para a solução Disable / Enable, funcionou maravilhas. Obrigado!
Albert Oldfield
Como posso desativá-lo?
miguelmpn
1
@miguelmpn textBox1.Enabled = false;desativará sua caixa de texto. e configurá-lo para truereativá-lo.
Raktim Biswas de
24

Você também pode definir a activecontrolpropriedade forms para nulllike

ActiveControl = null;
marcigo 36
fonte
7
Espero que as pessoas
descam
Ainda a melhor resposta para este dia, amigo, aceite meu voto positivo.
xoxel de
8

Focusdefine o foco de entrada, portanto configurá-lo para o formulário não funcionará porque os formulários não aceitam entrada. Tente definir a ActiveControlpropriedade do formulário para um controle diferente. Você também pode usar Selectpara selecionar um controle específico ou SelectNextControlpara selecionar o próximo controle na ordem das guias.

Velociraptores
fonte
1
Tentei de tudo aqui e Select()funcionou para mim.
Derek W
8

Tente este:

Primeiro configure a ordem das guias.

Então, no evento de carregamento de formulário, podemos enviar um pressionamento de tecla de tabulação programaticamente para o aplicativo. Assim, esse aplicativo dará foco ao primeiro controle na ordem das guias.

no carregamento do formulário até mesmo escrever esta linha.

SendKeys.Send("{TAB}");

Isso funcionou para mim.

Charith Rasanga
fonte
4

Esta postagem me levou a fazer isso:

ActiveControl = null;

Isso me permite capturar todas as entradas do teclado no nível superior sem que outros controles fiquem loucos.

Kristopher Ives
fonte
3

Encontrei uma boa alternativa! Funciona melhor para mim, sem definir o foco para outra coisa.

Tente isso:

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

Fiz isso no meu controle personalizado, fiz isso noFocus ()

this.Parent.Focus();

Portanto, se o texbox está focado - ele imediatamente focaliza a caixa de texto pai (formulário ou painel ...) Esta é uma boa opção se você quiser fazer isso no controle personalizado.

Tommix
fonte
2

Parece que não preciso definir o foco para nenhum outro elemento. Em um aplicativo do Windows Phone 7, tenho usado o método Focus para remover o foco de uma caixa de texto.

Dar o seguinte comando não definirá o foco para nada:

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

Funcionou comigo, mas não sei por que não funcionou para você: /

Bhawk1990
fonte
2

Uma solução simples seria matar o foco, basta criar sua própria classe:

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);
    }
}
VladL
fonte
Exatamente o tipo de solução que eu procurava. Obrigado!
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();
                });
            }
        }
    }
Toro
fonte
0

A maneira de contornar isso é colocar todos os meus controles de winform. Eu faço todos os rótulos e controles de winform não selecionados como ordem de tabulação 0, então meu primeiro controle como ordem de tabulação 2 e, em seguida, incremento a ordem de cada controle selecionável em 1, então 3, 4, 5 etc ...

Desta forma, quando meu Winforms inicia, o primeiro TextBox não tem foco!

CosineCuber
fonte
0

você pode fazer isso por dois métodos

  • apenas faça com que as propriedades "TabStop" da caixa de texto desejada sejam falsas agora ele não terá foco mesmo se você tiver um campo de texto
  • arraste duas caixas de texto

    1. faça um visível no qual você não quer foucus, que é a caixa de texto 1
    2. torne o segundo invisível e vá para as propriedades desse campo de texto e selecione

valor tabindex para 0 de textbox2

  1. e selecione o tabindex de sua caixa de texto 1 para 1 agora não irá focar na caixa de texto 1
Adiii
fonte
0

Se tudo o que você deseja é o efeito óptico de que a caixa de texto não tem nenhuma seleção azul em todo o seu conteúdo, basta selecionar nenhum texto:

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

Depois disso, ao adicionar conteúdo com .Text += "...", nenhuma seleção azul será exibida.

Roland
fonte
0

Por favor, tente definir TabStopcomo Falsepara seu controle de visualização que não está focado

Por exemplo:

txtEmpID.TabStop = false;
Shaheer
fonte
-1

No construtor do Form ou UserControl segurando a escrita TextBox

SetStyle(ControlStyles.Selectable, false);

Após o InitializeComponent (); Fonte: https://stackoverflow.com/a/4811938/5750078

Exemplo:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Loaderon
fonte