Se eu ligar SelectAll
de um GotFocus
manipulador de eventos, ele não funcionará com o mouse - a seleção desaparece assim que o mouse é liberado.
EDIT: As pessoas estão gostando da resposta de Donnelle, tentarei explicar por que não gostei tanto quanto a resposta aceita.
- É mais complexo, enquanto a resposta aceita faz a mesma coisa de uma maneira mais simples.
- A usabilidade da resposta aceita é melhor. Quando você clica no meio do texto, o texto fica desmarcado quando você solta o mouse, permitindo que você comece a editar instantaneamente e, se ainda deseja selecionar tudo, basta pressionar o botão novamente e desta vez não será desmarcado na liberação. Seguindo a receita de Donelle, se eu clicar no meio do texto, tenho que clicar pela segunda vez para poder editar. Se clicar em algum lugar dentro do texto e fora dele, provavelmente significa que quero começar a editar em vez de substituir tudo.
.net
wpf
silverlight
textbox
Sergey Aldoukhov
fonte
fonte
Respostas:
Não sei por que ele perde a seleção no
GotFocus
evento.Mas uma solução é fazer a seleção
GotKeyboardFocus
dosGotMouseCapture
eventos e. Dessa forma, sempre funcionará.fonte
Temos isso para que o primeiro clique selecione tudo e outro clique vá para o cursor (nosso aplicativo foi projetado para uso em tablets com canetas).
Você pode achar util.
fonte
SelectAllText
método detextBox.IsFocused
melhora. Você não deseja selecionar tudo quando issoGetKeyboardFocus
ocorrer devido às abas alternativas no programa.A resposta de Donnelle funciona melhor, mas ter que derivar uma nova classe para usá-la é uma dor.
Em vez de fazer isso, registro os manipuladores em App.xaml.cs para todos os TextBoxes no aplicativo. Isso me permite usar a resposta de Donnelle com o controle TextBox padrão.
Adicione os seguintes métodos ao seu App.xaml.cs:
fonte
Isso é bastante antigo, mas mostrarei minha resposta de qualquer maneira.
Escolhi parte da resposta de Donnelle (pulei o clique duplo) porque acho isso mais natural. No entanto, como gcores, não gosto da necessidade de criar uma classe derivada. Mas eu também não gosto do
OnStartup
método gcores . E eu preciso disso em uma base "geralmente, mas nem sempre".Eu implementei isso como um anexo
DependencyProperty
para que eu possa definirlocal:SelectTextOnFocus.Active = "True"
no xaml. Acho assim o mais agradável.Para o meu recurso "geral, mas nem sempre", defino esta propriedade Attache como
True
em (global)TextBox
Style
. Dessa forma, "selecionar o texto" está sempre "ativado", mas posso desativá-lo por caixa de texto.fonte
Aqui estão os comportamentos do Blend implementando a solução de resposta para sua conveniência:
Um para anexar a um único TextBox:
E um para anexar à raiz de um contêiner contendo vários TextBox'es:
fonte
Embora essa seja uma pergunta antiga, acabei de ter esse problema, mas o resolvi usando um comportamento anexado, em vez de um comportamento de expressão, como na resposta de Sergey. Isso significa que não preciso de uma dependência no
System.Windows.Interactivity
Blend SDK:Você pode usá-lo no seu XAML assim:
Eu escrevi sobre isso aqui .
fonte
Aqui está uma solução muito boa e muito simples no MSDN :
Aqui está o código por trás:
fonte
Eu acho que isso funciona bem:
Se você deseja implementá-lo como um método de extensão:
E no seu
GotFocus
evento:Eu descobri a solução acima porque, há vários meses, eu estava procurando uma maneira de definir o foco para um dado
UIElement
. Descobri o código abaixo em algum lugar (crédito é dado por aqui) e funciona bem. Eu o publico mesmo que não esteja diretamente relacionado à pergunta do OP, pois demonstra o mesmo padrão de usoDispatcher
para trabalhar com aUIElement
.fonte
Aqui está uma tentativa de resolver alguns dos problemas com outras soluções:
O código que escrevi é configurável. Você pode escolher em quais ações o seleccionar todo comportamento deve ocorrer, definindo três campos somente leitura:
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.A desvantagem desta solução é que ela é mais complexa e o estado estático é armazenado. Parece uma luta feia com o comportamento padrão do
TextBox
controle. Ainda assim, ele funciona e todo o código está oculto na classe de contêiner Attached Property.Para anexar a propriedade anexada a a
TextBox
, tudo o que você precisa fazer é adicionar o namespace xml (xmlns
) da propriedade anexada e usá-lo da seguinte maneira:Algumas notas sobre esta solução:
TextBox
lembra de sua seleção depois que perde o foco. Na verdade, eu substituí esse comportamento.TextBox
(FirstActionIsMouseDown
campo estático).ContextMenu
campo estático).O único efeito colateral que encontrei é quando
SelectOnMouseRightClick
é verdade. Às vezes, o menu de contexto do botão direito pisca quando é aberto e clicar com o botão direito do mouse em um espaço em branco no campoTextBox
"não selecionar tudo".fonte
Descobri que nenhuma das respostas aqui apresentadas imita uma caixa de texto padrão do Windows. Por exemplo, tente clicar no espaço em branco entre o último caractere da caixa de texto e o lado direito da caixa de texto. A maioria das soluções aqui sempre seleciona todo o conteúdo, o que dificulta a adição de texto a uma caixa de texto.
A resposta que apresento aqui se comporta melhor a esse respeito. É um comportamento (portanto, requer o assembly System.Windows.Interactivity do SDK do Blend ). Também pode ser reescrito usando as propriedades anexadas.
Isso é baseado no código que encontrei aqui .
fonte
Esta implementação simples funciona perfeitamente para mim:
Para aplicá-lo a todos
TextBox
, coloque o seguinte código apósInitializeComponent();
fonte
No arquivo App.xaml:
No arquivo App.xaml.cs:
Com esse código, você alcança tudo
TextBox
em seu aplicativo.fonte
Retirado daqui :
Registre o manipulador de eventos global no arquivo App.xaml.cs:
Em seguida, o manipulador é tão simples quanto:
fonte
Sei que isso é muito antigo, mas aqui está minha solução, baseada nos espaços de nomes expressões / interatividade e interatividade da Microsoft.
Primeiro, segui as instruções neste link para colocar os gatilhos de interatividade em um estilo.
Então tudo se resume a isso
e isto
No meu caso, eu tenho um controle de usuário onde estão as caixas de texto que possuem um code-behind. O code-behind tem a função de manipulador. Dei ao meu controle de usuário um nome em XAML e estou usando esse nome para o elemento. Isso está funcionando perfeitamente para mim. Simplesmente aplique o estilo a qualquer
TextBox
lugar em que você gostaria que todo o texto fosse selecionado ao clicar noTextBox
.O primeiro
CallMethodAction
chama oSelectAll
método da caixa de texto quando oGotKeyboardFocus
evento éTextBox
acionado.Eu espero que isso ajude.
fonte
Eu usei a resposta de Nils, mas converti para mais flexível.
No XAML, você pode usar como um destes:
fonte
Aqui está a versão em C # da resposta postada por @Nasenbaer
considerando que
MyTextBox_GotFocus
o manipulador de eventos é atribuído aoGotFocus
evento deMyTextBox
.fonte
Eu tenho uma resposta um pouco simplificada para isso (com apenas o
PreviewMouseLeftButtonDown
evento) que parece imitar a funcionalidade usual de um navegador:No XAML, você tem a
TextBox
dizer:Em codebehind:
fonte
Tente este método de extensão para adicionar o comportamento desejado a qualquer controle TextBox. Ainda não o testei extensivamente, mas parece atender às minhas necessidades.
fonte
Pesquisei bastante a solução, encontrei algumas soluções para selecionar todas. Mas, o problema é quando clicamos com o botão direito do mouse e recortamos / copiamos depois de selecionar parte do texto da caixa de texto, ela seleciona todas as partes que selecionei. Para corrigir isso aqui é a solução. Basta adicionar o código abaixo no evento de seleção do teclado. Isso funcionou para mim.
fonte
Eu tive o mesmo problema. No VB.Net, é fácil assim:
VB XAML:
Codehind:
C # (graças a ViRuSTriNiTy)
fonte
Esta é de longe a solução mais simples.
Adicione um manipulador global ao aplicativo (App.xaml.cs) e pronto. Você precisará de apenas algumas linhas de código.
Portanto, use a classe EventManager para registrar um manipulador de eventos global em um tipo (TextBox). O manipulador real é simples:
Verifique aqui: WPF TextBox SelectAll on Focus
Espero que ajude.
fonte
Para aqueles interessados na abordagem de Donnelle / Groky, mas deseja um clique à direita do último caractere (mas ainda dentro do
TextBox
) para colocar o sinal de intercalação no final do texto inserido, eu vim com esta solução:O
GetRoundedCharacterIndexFromPoint
método foi retirado deste post.fonte
Após pesquisar e testar, encontrei uma solução simples que funcionou para mim.
Você precisa adicionar um manipulador de
Loaded
eventos ao evento da janela do seu contêiner:Em seguida, você deve criar o manipulador para o referenciado
RoutedEventHandler
no código anterior:Agora, você pode adicionar o
SelectAll()
comando nosGotFocus
manipuladores de eventos a qualquerTextBox
controle separadamente:Seu texto agora está selecionado em foco!
Adaptado da solução Dr. WPF, fóruns do MSDN
fonte
fonte
Isso parece funcionar bem para mim. É basicamente uma recapitulação de algumas postagens anteriores. Acabei de colocar isso no meu arquivo MainWindow.xaml.cs no construtor. Crio dois manipuladores, um para teclado e outro para o mouse, e canalizo os dois eventos para a mesma função,
HandleGotFocusEvent
definida imediatamente após o construtor no mesmo arquivo.fonte
Uma maneira fácil de substituir o mouseDown e selecionar tudo após o clique duplo é:
fonte
Tente colocar isso no construtor de qualquer controle que esteja abrigando sua caixa de texto:
fonte
Se houver um evento que cancele a seleção de texto durante o
OnFocus
mouse, normalmente atraso a seleção de todos.fonte
Eu testei todos eles, mas apenas o seguinte deu certo:
fonte
GetType().Name
em vez deis
ouas
é bastante hackyVejo que há muitas respostas, mas como a aprovada, os métodos que devem ser usados são
EditTextBoxGotCapture
com o seguinte código por trás:
fonte