Estou procurando aceitar dígitos e o ponto decimal, mas nenhum sinal.
Eu olhei para exemplos usando o controle NumericUpDown para Windows Forms e este exemplo de um controle personalizado NumericUpDown da Microsoft . Mas até agora parece que o NumericUpDown (suportado ou não pelo WPF) não fornecerá a funcionalidade que eu quero. Da maneira como meu aplicativo é projetado, ninguém em sã consciência vai querer mexer nas setas. Eles não fazem nenhum sentido prático, no contexto da minha aplicação.
Então, estou procurando uma maneira simples de fazer com que um WPF TextBox padrão aceite apenas os caracteres que eu quero. Isso é possível? Isso é prático?
double.TryParse()
provavelmente seria implementado com o mesmo número de linhas e seria mais flexível.O manipulador de eventos está visualizando a entrada de texto. Aqui, uma expressão regular corresponde à entrada de texto apenas se não for um número e, em seguida, não é feita na caixa de texto de entrada.
Se você deseja apenas letras, substitua a expressão regular como
[^a-zA-Z]
.XAML
ARQUIVO XAML.CS
fonte
Eu usei parte do que já estava aqui e coloquei meu próprio toque nele usando um comportamento, para que eu não tenha que propagar esse código por uma tonelada de Views ...
Aqui está o código de visualização relevante:
fonte
Esta é uma solução aprimorada da resposta do WilP . Minhas melhorias são:
EmptyValue
Propriedade , se a sequência vazia for inadequadaO uso é bem direto:
fonte
MaxLength
seu condicionamento(this.MaxLength == 0 || text.Length <= this.MaxLength)
retornará semprefalse
ao testar o novo texto. Isso deve ser melhor(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
porque você defineint.MinValue
como valor padrão paraMaxLength
.UpdateSourceTrigger=PropertyChanged
à ligação. Alguma idéia de como fazer esse código funcionar ao alterar oUpdateSourceTrigger
está definido comoPropertyChanged
? Obrigado por compartilhar este código.Aqui está uma maneira muito simples e fácil de fazer isso usando o MVVM.
Vincule sua caixa de texto com uma propriedade inteira no modelo de exibição, e isso funcionará como uma gema ... até mostrará validação quando um não inteiro for inserido na caixa de texto.
Código XAML:
Ver código do modelo:
fonte
long
parafloat
, mas não funcionou muito bem com a validação imediata. Eu adicioneiUpdateSourceTrigger="PropertyChanged"
à ligação, para que ela executasse a validação à medida que cada caractere fosse digitado e não pudesse mais digitar um '.' no TextBox, a menos que haja um caractere ilegal presente (foi necessário digitar "1x.234" e excluir o 'x'). Também parece um pouco lento neste modo. Parece ser usadoSystem.Number.ParseSingle()
para fazer o trabalho, por isso aceita uma variedade de notações.Inclua uma REGRA DE VALIDAÇÃO para que, quando o texto for alterado, verifique se os dados são numéricos e, se houver, permitam que o processamento continue e, caso contrário, solicita ao usuário que apenas dados numéricos sejam aceitos nesse campo.
Leia mais em Validação no Windows Presentation Foundation
fonte
double
e isso já está fornecendo uma validação padrão.O Extended WPF Toolkit possui um: NumericUpDown
fonte
NumericUpDown
agora está obsoleto. você pode usarDecimalUpDown
o kit de ferramentas atualizado Extended WPF Toolkit ™ Community EditionTambém poderia simplesmente implementar uma regra de validação e aplicá-la ao TextBox:
Com a implementação da regra a seguir (usando o mesmo Regex proposto em outras respostas):
fonte
Aqui eu tenho uma solução simples inspirada na resposta de Ray . Isso deve ser suficiente para identificar qualquer forma de número.
Essa solução também pode ser facilmente modificada se você deseja apenas números positivos, valores inteiros ou valores precisos com um número máximo de casas decimais, etc.
Conforme sugerido na resposta de Ray , você precisa primeiro adicionar um
PreviewTextInput
evento:Em seguida, coloque o seguinte no código por trás:
fonte
Eu permiti números numéricos e backspace do teclado:
fonte
var keyEnum = (System.Windows.Input.Key) e.Key; e.Handled = !(keyEnum >= System.Windows.Input.Key.D0 && keyEnum <= System.Windows.Input.Key.D9 || keyEnum >= System.Windows.Input.Key.NumPad0 && keyEnum <= System.Windows.Input.Key.NumPad9 || keyEnum == System.Windows.Input.Key.Back);
Vou assumir que:
Seu TextBox para o qual você deseja permitir entrada numérica apenas tem sua propriedade Text definida inicialmente como um valor numérico válido (por exemplo, 2.7172).
Sua caixa de texto é filha da sua janela principal
Sua janela principal é da classe Window1
Seu nome do TextBox é numericTB
Ideia básica:
Adicione:
private string previousText;
à sua classe de janela principal (Window1)Adicione:
previousText = numericTB.Text;
ao construtor da janela principalCrie um manipulador para o evento numericTB.TextChanged para algo como isto:
Isso manterá a configuração previousText como numericTB.Text enquanto for válido e definir numericTB.Text como seu último valor válido se o usuário gravar algo que você não gosta. Obviamente, essa é apenas uma idéia básica, e é apenas "resistente a idiotas", não "à prova de idiotas". Ele não lida com o caso em que o usuário mexe com espaços, por exemplo. Então, aqui está uma solução completa que eu acho que é "prova de idiota", e se eu estiver errado, por favor me diga:
Conteúdo do seu arquivo Window1.xaml:
Conteúdo do seu arquivo Window.xaml.cs:
E é isso. Se você tiver muitos TextBoxes, recomendo criar um CustomControl que herda de TextBox, para que você possa agrupar previousText e numericTB_TextChanged em um arquivo separado.
fonte
Este é o único código necessário:
Isso permite que apenas números sejam inseridos na caixa de texto.
Para permitir um ponto decimal ou sinal de menos, você pode alterar a expressão regular para
[^0-9.-]+
.fonte
Se você não quiser escrever muito código para executar uma função básica (não sei por que as pessoas fazem métodos longos), basta fazer o seguinte:
Adicionar espaço para nome:
No XAML, defina uma propriedade TextChanged:
No WPF no método txt1_TextChanged, adicione
Regex.Replace
:fonte
Outra abordagem será usar um comportamento anexado; implementei minha classe TextBoxHelper personalizada , que pode ser usada em caixas de texto em todo o meu projeto. Porque achei que a inscrição nos eventos de todas as caixas de texto e de cada arquivo XAML individual para esse fim pode consumir muito tempo.
A classe TextBoxHelper que eu implementei possui os seguintes recursos:
Aqui está a implementação da classe TextBoxHelper:
E aqui está um exemplo de seu uso fácil:
Ou
Observe que meu TextBoxHelper reside no alias viewHelpers xmlns.
Espero que esta implementação facilite o trabalho de outras pessoas :)
fonte
no evento de keydown de visualização da caixa de texto.
fonte
fonte
.
, poise.Text
retorna apenas o último caractere de entrada e um ponto falhará naIsDigit
verificação.Para aqueles que procuram uma implementação rápida e muito simples para esse tipo de problema usando apenas números inteiros e decimais, no seu arquivo XAML, adicione uma
PreviewTextInput
propriedade ao seuTextBox
e, em seguida, no seu arquivo xaml.cs, use:É meio redundante continuar verificando toda a string toda vez que, como outros já mencionaram, você estiver fazendo alguma coisa com notação científica (embora, se você estiver adicionando certos caracteres como 'e', uma regex simples que adicione símbolos / caracteres seja realmente simples e ilustrado em outras respostas). Mas, para valores simples de ponto flutuante, essa solução será suficiente.
Escrito como uma linha com uma expressão lambda:
fonte
Podemos fazer a validação no evento alterado da caixa de texto. A implementação a seguir impede a entrada de pressionamento de tecla diferente de numérico e um ponto decimal.
fonte
Que tal agora? Funciona bem para mim. Espero não ter perdido nenhum caso extremo ...
fonte
No Windows Forms, era fácil; você pode adicionar um evento para o KeyPress e tudo funciona facilmente. No entanto, no WPF esse evento não está lá. Mas há uma maneira muito mais fácil para isso.
O WPF TextBox possui o evento TextChanged que é geral para tudo. Inclui colar, digitar e tudo o que puder vir à sua mente.
Então você pode fazer algo assim:
XAML:
CÓDIGO POR TRÁS:
Isso também aceita
.
, se você não quiser, basta removê-lo daregex
declaração@[^\d]
.Nota : Este evento pode ser usado em muitos TextBox'es, pois usa o
sender
Texto do objeto. Você só escreve o evento uma vez e pode usá-lo para vários TextBox'es.fonte
Agora eu sei que esta pergunta tem uma resposta aceita , mas pessoalmente, acho um pouco confusa e acredito que deveria ser mais fácil do que isso. Então, tentarei demonstrar como consegui que funcionasse da melhor maneira possível:
No Windows Forms , há um evento chamado
KeyPress
que é perfeitamente bom para esse tipo de tarefa. Mas isso não existe no WPF ; portanto, usaremos oPreviewTextInput
evento. Além disso, para a validação, acredito que se possa usar umforeach
para percorrertextbox.Text
e verificar se ele corresponde ;) a condição, mas honestamente, é isso que expressões regulares servem as .Mais uma coisa antes de mergulharmos no código sagrado . Para que o evento seja acionado, é possível fazer duas coisas:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
evento do formulário (em que a caixa de texto está):textBox.PreviewTextInput += onlyNumeric;
Acho que o segundo método é melhor, porque em situações como essa, você precisará aplicar a mesma condição (
regex
) a mais de umTextBox
e não deseja se repetir!.Finalmente, veja como você faria isso:
fonte
Aqui está a minha versão. É baseado em uma
ValidatingTextBox
classe base que apenas desfaz o que foi feito se não for "válido". Ele suporta colar, cortar, excluir, backspace, +, - etc.Para números inteiros de 32 bits, há uma classe Int32TextBox que apenas se compara a um int. Também adicionei classes de validação de ponto flutuante.
Nota 1: Ao usar a ligação WPF, certifique-se de usar a classe que se ajusta ao tipo de propriedade vinculada, caso contrário, poderá levar a resultados estranhos.
Nota 2: Ao usar classes de ponto flutuante com ligação WPF, verifique se a ligação usa a cultura atual para corresponder ao método TryParse que eu usei.
fonte
Aqui está uma biblioteca para entrada numérica no WPF
Possui propriedades como
NumberStyles
eRegexPattern
para validação.Subclasses WPF
TextBox
fonte
Usar:
fonte
Eu estava trabalhando com uma caixa não acoplada para um projeto simples em que estava trabalhando, então não pude usar a abordagem de ligação padrão. Consequentemente, criei um hack simples que outras pessoas podem achar bastante útil, simplesmente estendendo o controle TextBox existente:
Obviamente, para um tipo flutuante, você deseja analisá-lo como um flutuador e assim por diante. Os mesmos princípios se aplicam.
Em seguida, no arquivo XAML, você precisa incluir o espaço para nome relevante:
Depois disso, você pode usá-lo como um controle regular:
fonte
Depois de usar algumas das soluções aqui por algum tempo, desenvolvi minha própria que funciona bem para minha configuração do MVVM. Observe que não é tão dinâmico quanto alguns dos outros, no sentido de ainda permitir que os usuários digitem caracteres errados, mas impede que eles pressionem o botão e façam qualquer coisa. Isso vai bem com o meu tema de esmaecer botões quando ações não podem ser executadas.
Eu tenho um
TextBox
que um usuário deve digitar um número de páginas do documento a serem impressas:... com esta propriedade de ligação:
Eu também tenho um botão:
... com esta ligação de comando:
E há o método de
SetNumberOfPages()
, mas não é importante para este tópico. Funciona bem no meu caso, porque não preciso adicionar nenhum código ao arquivo code-behind do View e me permite controlar o comportamento usando aCommand
propriedadefonte
Ao verificar um valor numérico, você pode usar a função VisualBasic.IsNumeric .
fonte
No aplicativo WPF, você pode manipular isso manipulando o
TextChanged
evento:fonte
Para desenvolvedores que desejam que seus campos de texto aceitem números não assinados apenas como portas de soquete e assim por diante:
WPF
C #
fonte
65535
. Se for maior, não é uma porta válida. Além disso, a configuração deTextBox.MaxLength
para5
ajudaria programaticamente ou em XAML .Isto é o que eu usaria para obter uma caixa de texto WPF que aceita dígitos e o ponto decimal:
Coloque o código em um novo arquivo de classe, adicione
na parte superior do arquivo e construa a solução. O controle numericTextBox aparecerá na parte superior da caixa de ferramentas.
fonte