Ovladací prvek TextBox
v UWP podporuje obecný textový vstup, ale v některých situacích můžeme preferovat omezit jej pouze na číslice. V tomto článku ukážu dva možné přístupy jak toto rychle implementovat.
Zamezení nečíselného vstupu
Pokud chceme zajistit, aby do TextBoxu
nebylo vůbec možné zadat nečíselné znaky, můžeme použít událost BeforeTextChanging
.
V jejím handleru použijeme jednoduchou LINQ query na kontrolu, zda se vstup skládá pouze z číslic. Pokud ne, jednoduše pokus o změnu zrušíme vlastností Cancel
.
Filtrování nečíselného vstupu
Namísto zamezení nečíselného vstupu můžeme také pouze vyfiltrovat nečíselné znaky. V tomto případě můžeme použít událost TextChanging
, která se pro tuto situaci skvěle hodí, jak říká dokumentace (přeloženo do češtiny):
Když dojde k události TextChanging, vlastnost Text již reflektuje novou hodnotu (ale není ještě renderována v UI). Typicky zpracujete tento even k aktualizaci hodnoty Text a výběru předtím, než je text vyrenderován. To zabraňuje "probliknutí" ke kterému by došlo, kdyby byl text vykreslen a následně změněn a okamžitě překreslen.
Handler události znovu využívá LINQ díky čemuž je logika jasná a jednoduchá. Vezmeme vlastnost Text
a nahradíme ji verzí obsahující pouze číselné znaky.
Poznámka: Obě uvedená řešení fungují pro jednoduchý číselný vstup. Mohou být rozšířena pro obecnější číselný zápis jako pro desetinná čísla nebo o podporu rozdělovačů mezi tisíci. V těchto případech je však nutné mít na paměti, že v každém jazyce je jiný styl formátování vstupu, takže je většinou vhodnějšízajistit správné nastavení vlastnosti TextBox.InputScope
a následně provést validaci vstupu přímo v kódu pomocí zabudovaných metod TryParse
v .NETu, které podporují formátování dle zadané kultury.