Quando uma caixa de texto C # WinForms recebe foco, quero que ela se comporte como a barra de endereço do navegador.
Para entender o que quero dizer, clique na barra de endereços do seu navegador. Você notará o seguinte comportamento:
- Clicar na caixa de texto deve selecionar todo o texto se a caixa de texto não estiver focada anteriormente.
- O mouse para baixo e arraste na caixa de texto deve selecionar apenas o texto destacado com o mouse.
- Se a caixa de texto já estiver focada, clicar em não selecionará todo o texto.
- Focar a caixa de texto de forma programática ou através das guias do teclado deve selecionar todo o texto.
Eu quero fazer exatamente isso no WinForms.
ALERTA MAIS RÁPIDA DA ARMA: leia o seguinte antes de responder! Obrigado rapazes. :-)
Chamar .SelectAll () durante os eventos .Enter ou .GotFocus não funcionará porque se o usuário clicar na caixa de texto, o cursor será colocado onde ele clicou, desmarcando todo o texto.
Chamar .SelectAll () durante o evento .Click não funcionará porque o usuário não poderá selecionar nenhum texto com o mouse; a chamada .SelectAll () continuará substituindo a seleção de texto do usuário.
Chamar BeginInvoke ((Action) textbox.SelectAll) no evento focus / enter enter não funciona porque quebra a regra # 2 acima, continuará substituindo a seleção do usuário no foco.
fonte
Respostas:
Primeiro de tudo, obrigado por respostas! 9 respostas no total. Obrigado.
Más notícias: todas as respostas tiveram algumas peculiaridades ou não funcionaram muito bem (ou nada). Adicionei um comentário a cada uma das suas postagens.
Boas notícias: Encontrei uma maneira de fazê-lo funcionar. Essa solução é bastante direta e parece funcionar em todos os cenários (passar o mouse, selecionar texto, tabular o foco etc.)
Pelo que sei, isso faz com que uma caixa de texto se comporte exatamente como a barra de endereço de um navegador da web.
Espero que isso ajude o próximo cara que tenta resolver esse problema enganosamente simples.
Mais uma vez obrigado, pessoal, por todas as suas respostas que me ajudaram a seguir o caminho correto.
fonte
alreadyFocused = true;
MouseUp para fora da instrução if. Porque se você selecionar imediatamente partes do texto, o próximo clique selecionará o texto inteiro novamente.Encontrei uma solução mais simples para isso. Envolve o lançamento de SelectAll de forma assíncrona,
Control.BeginInvoke
para que ocorra após a ocorrência dos eventos Enter e Click:Em c #:
No VB.NET (graças a Krishanu Dey )
fonte
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
, não funciona como desejado. Mas ainda assim a solução mais curto e mais elegante :)Sua solução é boa, mas falha em um caso específico. Se você focar o TextBox selecionando um intervalo de texto em vez de apenas clicar, o sinalizador jáFocado não será definido como true; portanto, quando você clica no TextBox pela segunda vez, todo o texto é selecionado.
Aqui está a minha versão da solução. Eu também coloquei o código em uma classe que herda TextBox, para que a lógica fique bem escondida.
fonte
É um pouco arrogante, mas no evento de clique, use
SendKeys.Send( "{HOME}+{END}" );
.fonte
Clique em evento da caixa de texto? Ou mesmo o evento MouseCaptureChanged funciona para mim. - ESTÁ BEM. não funciona
Então você tem que fazer 2 coisas:
Também funciona para tabulação (através de caixas de texto para essa) - chame SelectAll () em Enter apenas no caso de ...
fonte
Uma resposta de uma linha que eu uso ... você pode estar se chutando ...
No evento Enter:
txtFilter.BeginInvoke (novo MethodInvoker (txtFilter.SelectAll));
fonte
Ok, depois de tentar aqui é o que você deseja:
Isso selecionou todo o texto na entrada, mas me permitiu destacar parte do texto posteriormente ou permitir que você realce no primeiro clique.
Por solicitação:
Para mim, a tabulação no controle seleciona todo o texto.
fonte
Aqui está uma função auxiliar que leva a solução ao próximo nível - reutilize sem herança.
Para usar isso, basta chamar a função que passa por um TextBox e ele cuida de todos os bits confusos para você. Sugiro ligar todas as suas caixas de texto no evento Form_Load. Você pode colocar essa função em seu formulário ou, se gostar de mim, em algum lugar de uma classe de utilitário para ainda mais reutilização.
fonte
Isso funcionou para um TextBox WPF / XAML.
fonte
Isso é semelhante à resposta popular de nzhenry , mas acho mais fácil não precisar subclassificar:
fonte
SelectAll nunca funcionou para mim.
Isso funciona.
fonte
Encontrei uma solução ainda mais simples:
Para garantir que todo o texto seja selecionado ao clicar em uma caixa de texto, verifique se o manipulador de Click chama o manipulador Enter. Não há necessidade de variáveis extras!
Exemplo:
fonte
fonte
Curiosamente, uma ComboBox com DropDownStyle = Simple tem exatamente o comportamento que você está procurando, eu acho.
(Se você reduzir a altura do controle para não mostrar a lista - e depois mais alguns pixels - não haverá diferença efetiva entre a ComboBox e a TextBox.)
fonte
Por que você simplesmente não usa o MouseDown-Event da caixa de texto? Funciona bem para mim e não precisa de um booleano adicional. Muito limpo e simples, por exemplo:
fonte
Liguei para SelectAll dentro do evento MouseUp e funcionou bem para mim.
fonte
Basta derivar uma classe de TextBox ou MaskedTextBox:
E use-o em seus formulários.
fonte
Você já tentou a solução sugerida no Fórum do MSDN "Windows Forms General", que simplesmente subclasse o TextBox?
fonte
Na verdade, o GotFocus é o evento certo (mensagem realmente) em que você está interessado, pois não importa como você obtenha o controle, você conseguirá isso eventualmente. A questão é quando você chama SelectAll ().
Tente o seguinte:
fonte
Para um grupo de caixas de texto em um formulário:
fonte
Sei que isso já foi resolvido, mas tenho uma sugestão de que acho que é realmente bastante simples.
No evento mouse up, tudo o que você precisa fazer é colocar
Parece funcionar para mim no VB.NET (eu sei que essa é uma pergunta em C # ... infelizmente, sou forçada a usar o VB no meu trabalho .. e eu estava tendo esse problema, e foi isso que me trouxe aqui ... )
Ainda não encontrei nenhum problema com ele .. exceto pelo fato de não selecionar imediatamente ao clicar, mas estava tendo problemas com isso ....
fonte
A seguinte solução funciona para mim. Eu adicionei
OnKeyDown
eOnKeyUp
eventos override para manter o texto TextBox sempre selecionado.fonte
Defina a seleção quando você sair do controle. Estará lá quando você voltar. Guia ao redor do formulário e quando você retornar ao controle, todo o texto será selecionado.
Se você entrar com o mouse, o cursor será colocado corretamente no ponto em que você clicou.
fonte
Solução muito simples:
EDITAR: O OP original estava particularmente preocupado com a seqüência de mouse para baixo / seleção de texto / mouse para cima; nesse caso, a solução simples acima acabaria com o texto sendo parcialmente selecionado.
Isso deve resolver * o problema (na prática, intercepto WM_SETCURSOR):
* Na verdade, a sequência a seguir termina com a seleção parcial de texto, mas se você mover o mouse sobre a caixa de texto, todo o texto será selecionado novamente:
mouse-down / seleção-de-texto / mouse-move-out-textbox / mouse-up
fonte
Acho esse trabalho melhor quando o mouse clica e não é liberado imediatamente:
fonte
Minha solução é bastante primitiva, mas funciona bem para o meu propósito
fonte
O abaixo parece funcionar. O evento enter lida com as guias do controle e o MouseDown funciona quando o controle é clicado.
fonte
A resposta pode ser realmente muito mais simples do que TODAS as opções acima, por exemplo (no WPF):
é claro que não sei como você deseja usar esse código, mas a parte principal a ser examinada aqui é: Primeira chamada .Focus () e depois chamada .SelectAll ();
fonte
basta usar selectall () em inserir e clicar em eventos
fonte
Eu criei um novo projeto VB.Net Wpf. Criei um TextBox e usei o seguinte para o codebehind:
fonte